C++ VS2010是否预先计算由#define定义的预处理器?

C++ VS2010是否预先计算由#define定义的预处理器?,c++,visual-studio-2010,macros,c-preprocessor,C++,Visual Studio 2010,Macros,C Preprocessor,对于VisualStudio2010,如果我定义 #define PI 4.0f*atan(1.0f) 当PI在代码后面的某个地方使用时,是否需要再次计算该值,或者只需计算3.1415926。。。插上电源?谢谢 编辑: 因为我听说有人说编译器可能会进行优化,用3.1415926..替换它,这取决于编译器 当预处理器运行时,它会将PI的每个实例替换为4.0*atan(1.0f)当预处理器运行时,它会将PI的每个实例替换为4.0*atan(1.0f)\define是一种“复制粘贴”类型的东西。如果

对于VisualStudio2010,如果我定义

#define PI 4.0f*atan(1.0f)
PI
在代码后面的某个地方使用时,是否需要再次计算该值,或者只需计算3.1415926。。。插上电源?谢谢

编辑:


因为我听说有人说编译器可能会进行优化,用3.1415926..替换它,这取决于编译器

当预处理器运行时,它会将
PI
的每个实例替换为
4.0*atan(1.0f)
当预处理器运行时,它会将
PI
的每个实例替换为
4.0*atan(1.0f)
\define
是一种“复制粘贴”类型的东西。如果你的代码说std::cout
#define
是一种“复制粘贴”类型的东西。如果您的代码显示
std::cout,
#define
将直接替换文本。正因为如此,无论你在哪里,它都会被
4.0f*atan(1.0f)
所取代。我怀疑编译器会在代码生成过程中对此进行优化,但唯一真正知道的方法是编译它并检查程序集

我发现这将采用C++代码并生成程序集输出。如果启用优化,您将看到为显示

PI
而生成的代码消失了,现在它只是一个被引用的常量。

定义将直接进行文本替换。正因为如此,无论你在哪里,它都会被
4.0f*atan(1.0f)
所取代。我怀疑编译器会在代码生成过程中对此进行优化,但唯一真正知道的方法是编译它并检查程序集


我发现这将采用C++代码并生成程序集输出。如果启用优化,您将看到为显示

PI
而生成的代码消失了,现在它只是一个被引用的常量。

宏是简单的文本替换,编译器会多次看到表达式。VisualStudio中的优化器知道如何在编译时计算值。对VS2010不是100%确定,它已经过时了。如果出于舍入和精度的原因,您不要求编译器做任何事情,则通常会在运行时计算浮点值。如果您自己定义了
atan()
呢?预处理器不能盲目地假定您指的是哪个
atan
。据它所知,您的表达式返回一个复数。宏是简单的文本替换,编译器会多次看到表达式。VisualStudio中的优化器知道如何在编译时计算值。对VS2010不是100%确定,它已经过时了。如果出于舍入和精度的原因,您不要求编译器做任何事情,则通常会在运行时计算浮点值。如果您自己定义了
atan()
呢?预处理器不能盲目地假定您指的是哪个
atan
。据它所知,您的返回的是一个复数。