宏用一些预定义的值替换未定义的标记

时间:2018-02-02 10:13:56

标签: c macros c-preprocessor

用一些预定义的值替换未定义的标记的宏。

我想有一些EXPAND(x)宏,如果定义了x,将扩展为x,例如,如果不是,则扩展为-1,这样代码:

#define M1 1
#define M2 2
#undef  M3
#define M4 (2*2)

printf("%i %i %i %i", EXPAND(M1), EXPAND(M2), EXPAND(M3), EXPAND(M4)); 

会打印:

1 2 -1 4

这可能在C?我能想到的只有字符串化x然后用constexpr函数解析它,但这只会在简单的情况下起作用。

1 个答案:

答案 0 :(得分:0)

执行此操作的唯一方法是使用一些知道所有可能宏的头文件并检查它们是否已定义。如果没有,请用-1替换它们。

#ifndef M1
#define M1 -1
#endif

#ifndef M2
#define M2 -1
#endif

...

然后,您将在包含宏的文件/宏定义之后包含此标头。

虽然请注意这是一个糟糕的设计,充满紧密耦合和其他令人难以置信的坏主意。解决实际问题肯定有更好的方法,例如确保在某个宏丢失时代码不会编译。