我正在处理的程序中遇到问题。我正在尝试--help来显示编译或不编译的功能。然而,有很多这些,“正常”的方式太冗长。 E.g:
#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
?
答案 0 :(得分:3)
如果您将其定义为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);
您必须先检查#if HAVE_FOO
而不是#ifdef HAVE_FOO
,如果您的功能数量以数百万计运行,您的--help
消息可能会显示得慢一些(其中)我总是推荐一个不同的架构。)
答案 1 :(得分:2)
你无法在C中执行此操作。通常的方法是从Perl或Python中的某些文本描述中生成这样的标题。
答案 2 :(得分:0)
您不能使用宏来创建另一个预处理指令。在宏扩展开始之前,所有预处理指令都被识别,因此您的宏将被解释为错误的C代码。