我该如何让#define函数循环?

You*_*Kim 1 c macros loops c-preprocessor

我有#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;
}
Run Code Online (Sandbox Code Playgroud)

我可以使用诸如for循环之类的东西来代替100行的define函数调用。还是有其他解决方案?

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

Ric*_*ers 5

您的问题是询问您是否可以将C语言与Preprocessor指令混合使用,以同时使用C语言和Preprocessor指令来自动生成代码。

由于预处理器和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;
}
Run Code Online (Sandbox Code Playgroud)

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

mygen >junk.h
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)