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

时间:2019-06-13 05:09:48

标签: c loops macros 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;
}

我可以使用for这样的循环代替100行的define函数调用。还是有其他解决方案?

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

2 个答案:

答案 0 :(得分: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;
}

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

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;
}

答案 1 :(得分:2)

您可以通过定义另一个宏来保存一些输入内容:

#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;

#define DEF_GLOBAL_STRUCT_DECADE(tens) \
    DEF_GLOBAL_STRUCT(tens##0) \
    DEF_GLOBAL_STRUCT(tens##1) \
    DEF_GLOBAL_STRUCT(tens##2) \
    DEF_GLOBAL_STRUCT(tens##3) \
    DEF_GLOBAL_STRUCT(tens##4) \
    DEF_GLOBAL_STRUCT(tens##5) \
    DEF_GLOBAL_STRUCT(tens##6) \
    DEF_GLOBAL_STRUCT(tens##7) \
    DEF_GLOBAL_STRUCT(tens##8) \
    DEF_GLOBAL_STRUCT(tens##9)

DEF_GLOBAL_STRUCT(1)
DEF_GLOBAL_STRUCT(2)
DEF_GLOBAL_STRUCT(4)
DEF_GLOBAL_STRUCT(5)
DEF_GLOBAL_STRUCT(6)
DEF_GLOBAL_STRUCT(7)
DEF_GLOBAL_STRUCT(8)
DEF_GLOBAL_STRUCT(9)
DEF_GLOBAL_STRUCT_DECADE(1)
DEF_GLOBAL_STRUCT_DECADE(2)
DEF_GLOBAL_STRUCT_DECADE(3)
DEF_GLOBAL_STRUCT_DECADE(4)
DEF_GLOBAL_STRUCT_DECADE(5)
DEF_GLOBAL_STRUCT_DECADE(6)
DEF_GLOBAL_STRUCT_DECADE(7)
DEF_GLOBAL_STRUCT_DECADE(8)
DEF_GLOBAL_STRUCT_DECADE(9)
DEF_GLOBAL_STRUCT(100)

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