Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用另一个宏生成#ifdef,#endif子句_C_Macros_C Preprocessor - Fatal编程技术网

C 使用另一个宏生成#ifdef,#endif子句

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"); 现在,由于我基本上必须为每个特性都这

我正在做的一个程序有问题。我正在尝试输入--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");
现在,由于我基本上必须为每个特性都这样做,所以会有大量的行,这是我不想要的

所以我想我应该为它写一些宏:

#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代码

猜测您在
功能声明中缺少
[]
,否?猜测您在
功能声明中缺少
[]
,否?