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