首页 > 解决方案 > 如何制作#define函数的for循环?

问题描述

我有#define带有参数的函数,DEF_GLOBAL_STRUCT(index)我需要从 1 到 100 调用这个宏。最好的方法是什么?我可以使用for循环吗?

我制作了简单的代码来显示我的问题。

#include <stdio.h>
#include <stdint.h>

#define DEF_GLOBAL_STRUCT(index)    uint8_t m_##index##_size=2; \
    uint32_t m_##index##_data1=0; \
    uint32_t m_##index##_data2=0;

DEF_GLOBAL_STRUCT(1)
DEF_GLOBAL_STRUCT(2)
DEF_GLOBAL_STRUCT(3)
// ...
DEF_GLOBAL_STRUCT(100)

int main()
{
    printf("%u\n", m_1_size);
    return 0;
}

for我可以使用循环之类的东西来代替 100 行定义函数调用吗?或者有没有其他解决方案?

如果我拥有代码的所有控制权,我可以定义结构并用数组声明它。但我做不到。我需要使用这种类型的定义函数。那是我的局限。

标签: cloopsmacrosc-preprocessor

解决方案


您的问题是询问您是否可以将 C 语言与预处理器指令混合使用,以使用 C 语言和预处理器指令自动生成代码。

由于预处理器和 C 编译器的工作方式,答案不在于您尝试执行此操作的方式。

预处理器是一个独立于编译的步骤。这个想法是预处理器执行 C 源代码文件的文本替换步骤以生成 C 源代码文件的新临时版本,然后由 C 编译器编译。

这是两个不同的步骤,首先预处理器完成它的工作,然后 C 编译器完成它的工作。

我的建议是编写一个简单的程序,生成一个包含您要使用的定义列表的包含文件。然后在您想要放置这些定义的地方,使用#include 指令在该点包含它。

因此,如果您有一个简单的脚本或者可能是一个 C 程序,例如:

#include <stdio.h>

int main ()
{
    int i;
    for (i = 1; i <= 100; i++) printf ("DEF_GLOBAL_STRUCT(%d)\n", i);

    return 0;
}

然后编译它并从命令行运行它,重定向输出,如下所示:

mygen >junk.h

然后在你需要这些指令的地方:

#include <stdio.h>
#include <stdint.h>

#define DEF_GLOBAL_STRUCT(index)    uint8_t m_##index##_size=2; \
    uint32_t m_##index##_data1=0; \
    uint32_t m_##index##_data2=0;

#include "junk.h"

int main()
{
    printf("%u\n", m_1_size);
    return 0;
}

推荐阅读