gpt4 book ai didi

C 预处理器 #if 处理非整数常量

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:19 25 4
gpt4 key购买 nike

我有以下代码片段,可以让我在浮点值的 double 和浮点表示之间轻松切换:

#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

这个意思对程序员来说很明显,但我不确定预处理器是怎么处理的?

它一定是一个错误吧?

最佳答案

I have -Wall compiler setting to give me plenty of warnings but this didn't get flagged up as an issue.

代码有效,但您的担心是对的。

My question is how is the preprocessor interpreting:

#if FP_TYPE == double

好问题。

The meaning is obvious to the programmer, but I'm not sure what the preprocessor makes of it?

意图 的含义似乎很明显,作为代码的作者,您知道您的意思。但是您似乎真正想要的并不是预处理器如何解释该条件。

预处理器条件中的表达式被解释为整数常量表达式。就像在 C if 语句中一样,如果表达式的计算结果为 0,则条件被视为 false,否则被视为 true。表达式中的所有宏在计算之前都会展开,并且任何剩余的标识符都将替换为 0。详情见 section 6.10.1 of the standard .

假设没有名为 FP_TYPEdouble 的宏的范围内定义(typedef 不是 一个宏定义),你的条件相当于

#if 0 == 0

,始终为真。

Its got to be a bug right?

预处理结果将不是您想要的,因此这是您代码中的错误。另一方面,编译器接受它是正确的。

关于C 预处理器 #if 处理非整数常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com