[英]C Preprocessor #if handling of non-integer constant
我有以下代码段使我可以轻松地在浮点值的双精度表示和浮点表示之间进行切换:
#define FLOATINGPOINTSIZE 64
#if FLOATINGPOINTSIZE == 64
typedef double FP_TYPE;
#define FP_LIT_SUFFIX
#else
typedef float FP_TYPE;
#define FP_LIT_SUFFIX f
#endif
在另一个位置,我写了以下内容:
/* set floating point limits used when initialising values that will be subject
* to the MIN() MAX() functions
*
* uses values from float.h */
#if FP_TYPE == double
#define FPTYPE_MAX DBL_MAX
#define FPTYPE_MIN DBL_MIN
#else
#define FPTYPE_MAX FLT_MAX
#define FPTYPE_MIN FLT_MIN
#endif
而我认为我应该写:
#if FLOATINGPOINTSIZE == 64
我有-Wall
编译器设置,可以给我很多警告,但是并没有将其标记为问题。 可能-Wall
是否完全独立于预处理程序?
我的问题是预处理器如何解释:
#if FP_TYPE == double
含义对于程序员来说是显而易见的,但是我不确定预处理器是由什么组成的?
它一定是个错误吧?
我有-Wall编译器设置,可以给我很多警告,但是并没有将其标记为问题。
该代码有效,但是您值得关注。
我的问题是预处理器如何解释:
#if FP_TYPE == double
好问题。
含义对于程序员来说是显而易见的,但是我不确定预处理器是由什么组成的?
预期的含义很明显,作为代码的作者,您知道您的意思了。 但是,您看上去的意图确实不是预处理器如何解释该条件。
预处理条件中的表达式被解释为整数常量表达式。 就像在C if
语句中一样,如果表达式的计算结果为0,则条件被视为false,否则被视为true。 表达式中的所有宏在进行求值前都会先进行扩展,并将所有剩余的标识符替换为0 。 详细信息在标准的6.10.1节中介绍。
假设没有命名为FP_TYPE
或double
的宏的作用域内定义(并且typedef
不是宏定义),则条件等于
#if 0 == 0
,这始终是正确的。
它一定是个错误吧?
预处理结果将不是您想要的,因此是代码中的错误。 另一方面,编译器正确接受它。
含义对于程序员来说是显而易见的,但是我不确定预处理器是由什么组成的?
它一定是个错误吧?
从用户的角度来看,这是一个错误,但不是预处理器中的错误。
#if FP_TYPE == double
被解释为
#if 0 == 0
因为FP_TYPE
和double
都不是预处理器的已知符号。
来自https://gcc.gnu.org/onlinedocs/cpp/If.html#If :
不是宏的标识符,这些标识符都被视为数字零。 这使您可以编写
#if MACRO
而不是#ifdef MACRO
,如果您知道MACRO
在定义时将始终具有非零值。 在没有函数调用括号的情况下使用的类似函数的宏也被视为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.