在 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
宏通过宏扩展其参数并将它们连接在一起来工作。重新扫描时,如果结果为 doubledouble
或 floatfloat
,则进一步扩展为 1。如果它是未定义为宏名称的标识符,则 #if
将其视为0.
当然,这并非万无一失。如果 REAL
具有多标记扩展,例如 long double
,则它不起作用。与其他定义的宏名称发生冲突的风险也很小。
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
宏通过宏扩展其参数并将它们连接在一起来工作。重新扫描时,如果结果为 doubledouble
或 floatfloat
,则进一步扩展为 1。如果它是未定义为宏名称的标识符,则 #if
将其视为0.
当然,这并非万无一失。如果 REAL
具有多标记扩展,例如 long double
,则它不起作用。与其他定义的宏名称发生冲突的风险也很小。