C 使用另一个宏生成#ifdef,#endif子句
我正在做的一个程序有问题。我正在尝试输入--help来显示哪些功能是编译的,哪些不是编译的。然而,有相当多的这些和“正常”的方式是太冗长。例如:C 使用另一个宏生成#ifdef,#endif子句,c,macros,c-preprocessor,C,Macros,C Preprocessor,我正在做的一个程序有问题。我正在尝试输入--help来显示哪些功能是编译的,哪些不是编译的。然而,有相当多的这些和“正常”的方式是太冗长。例如: #ifdef HAVE_FOO static const bool have_foo = true; #else static const bool have_foo = false; #endif printf("Support for foo: %s\n", have_foo ? "yes" : "no"); 现在,由于我基本上必须为每个特性都这
#ifdef HAVE_FOO
static const bool have_foo = true;
#else
static const bool have_foo = false;
#endif
printf("Support for foo: %s\n", have_foo ? "yes" : "no");
现在,由于我基本上必须为每个特性都这样做,所以会有大量的行,这是我不想要的
所以我想我应该为它写一些宏:
#define _SUPP(X) #ifdef HAVE_##X \
static const bool _##X##_SUPP = true; \
#else \
static const bool _##X##_SUPP = false; \
#endif
#define _PRINTSUPP(var, name, desc) printf("\t%s - %s: %s\n", name, desc, _##var##_SUPP ? "yes" : "no")
然而,这里有一个问题。宏将扩展为一行,预处理器将被阻塞。有没有办法生成中间有实际换行符的宏,或者可以在一行上计算
#ifdef
,Perl或Python。在C中不能这样做。通常的方法是从一些文本描述(例如Perl或Python)中生成这样的标题。如果不定义HAVE_FOO
,而是将其定义为0
,则可以执行以下操作:
const struct {
bool present;
const char *name;
} features[NFEATURES] = {
{HAVE_FOO, "foo"},
{HAVE_BAR, "bar"},
...
};
for (size_t i=0; i < NFEATURES; i++)
if (features[i].present)
printf(" ... and we've got: %s\n", features[i].name);
const结构{
布尔现在;
常量字符*名称;
}特征[n特征]={
{HAVE_FOO,“FOO”},
{HAVE_BAR,“BAR”},
...
};
对于(大小i=0;i
你必须检查
#如果have_FOO
而不是#如果def have_FOO
,那么如果你的——help
消息的显示速度可能会稍慢一些,如果你的功能数量达到了数不清的程度(在这种情况下,我会推荐一种不同的架构)。如果,而不是不定义have_FOO
,将其定义为0
,可以执行以下操作:
const struct {
bool present;
const char *name;
} features[NFEATURES] = {
{HAVE_FOO, "foo"},
{HAVE_BAR, "bar"},
...
};
for (size_t i=0; i < NFEATURES; i++)
if (features[i].present)
printf(" ... and we've got: %s\n", features[i].name);
const结构{
布尔现在;
常量字符*名称;
}特征[n特征]={
{HAVE_FOO,“FOO”},
{HAVE_BAR,“BAR”},
...
};
对于(大小i=0;i
您必须检查
#if have_FOO
而不是#ifdef have_FOO
,如果大量功能运行,您的--help
消息可能会显示得稍慢一些(在这种情况下,我建议使用不同的体系结构).不能使用宏创建另一个预处理指令。在宏展开开始之前,所有预处理指令都会被识别,因此宏将被解释为错误的C代码 不能使用宏创建另一个预处理指令。在宏展开开始之前,所有预处理指令都会被识别,因此宏将被解释为错误的C代码 猜测您在功能声明中缺少[]
,否?猜测您在功能声明中缺少[]
,否?