在 C 中正确使用#if 指令?

Proper usage of #if directive in C?

C 预处理器指令的以下结构 #if 运行良好。

#define C  1

#if C==1
...
#endif

但我想使用这样的东西:

#define REAL double

#if REAL==double
...
#elif REAL==float
...
#else
   assert(0);
#endif

无效。有解决办法吗?

Is there a solution?

有很多方法可以将宏扩展与条件编译结合起来。目前尚不清楚您会考虑其中的哪一个解决方案,但有一种可能性:

#define doubledouble 1
#define floatfloat 1

#define concat_literal(x,y) x ## y
#define realtype(t1,t2) concat_literal(t1,t2)

// ...

#define REAL float

#if realtype(REAL, double)
    // REAL is double
#elif realtype(REAL, float)
    // REAL is float
#else
    // REAL is something else
#endif

realtype 宏通过宏扩展其参数并将它们连接在一起来工作。重新扫描时,如果结果为 doubledoublefloatfloat,则进一步扩展为 1。如果它是未定义为宏名称的标识符,则 #if 将其视为0.

当然,这并非万无一失。如果 REAL 具有多标记扩展,例如 long double,则它不起作用。与其他定义的宏名称发生冲突的风险也很小。