我有一个带有#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函数调用。还是有其他解决方案?
如果我拥有代码的所有控制权,则可以定义结构并使用数组进行声明。但是我做不到。我需要使用这种类型的定义函数。那是我的限制。
答案 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;
}