有没有C预处理器变量?

yma*_*man 5 c variables c-preprocessor

C中有什么类似预处理器变量的吗?它可以简化我的定义.

目前我有这样的事情:

typedef struct mystruct {
  int val1;
  int val2;
  int val3;
  int val4;
} MYSTRUCT;

typedef struct mysuperstruct {
  MYSTRUCT *base;
  int val;
} MYSUPERSTRUCT;


#define MY_OBJECT_BEGIN(name, val1, val2, val3, val4) \
  MYSTRUCT name##Base = { val1, val2, val3, val4 }; \
  MYSUPERSTRUCT * name##Objs = {

#define MY_OBJECT_VALUE(name, val) \
  { &(name##Base), val },

#define MY_OBJECT_END() \
  NULL \
};
Run Code Online (Sandbox Code Playgroud)

它以这种方式使用:

MY_OBJECT_BEGIN(obj1, 1, 2, 3, 4)
MY_OBJECT_VALUE(obj1, 5)
MY_OBJECT_VALUE(obj1, 6)
MY_OBJECT_VALUE(obj1, 7)
MY_OBJECT_END()
Run Code Online (Sandbox Code Playgroud)

这产生了这样的事情:

MYSTRUCT obj1Base = { 1, 2, 3, 4 };
MYSUPERSTRUCT * obj1Objs = {
  { &(obj1Base), 5 },
  { &(obj1Base), 6 },
  { &(obj1Base), 7 },
  NULL
}
Run Code Online (Sandbox Code Playgroud)

很明显,重复使用对象名称是多余的.我想将MY_OBJECT_BEGIN定义中的名称存储到某个预处理器变量中,以便我可以通过以下方式使用它:

MY_OBJECT_BEGIN(obj1, 1, 2, 3, 4)
MY_OBJECT_VALUE(5)
MY_OBJECT_VALUE(6)
MY_OBJECT_VALUE(7)
MY_OBJECT_END()
Run Code Online (Sandbox Code Playgroud)

标准C预处理器是否提供了实现此目的的方法?

lda*_*v1s 7

没有标准的C预处理器变量.正如Oli Charlesworth建议的那样,使用X-Macros可能是你最好的选择,如果你想用标准C保持它.如果真的有很多相关数据会触及几个文件,你会想要使用像这样的代码生成器GNU autogen.