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

时间:2015-06-04 20:12:13

标签: c++ visual-studio-2010 macros c-preprocessor

对于Visual Studio 2010,如果我定义

#define PI 4.0f*atan(1.0f)

在代码后面的某处使用PI时,是否需要再次计算值,或者只是插入3.1415926?感谢。

修改

因为我听到有人说编译器可能会优化以用3.1415926 ..替换它,具体取决于编译器。

3 个答案:

答案 0 :(得分:3)

#define是一种“复制粘贴”类型的东西。如果您的代码显示std::cout << PI;,那么编译器会假装您键入std::cout << 4.0f*atan(1.0f);

定义的值是计算直到它们被使用,并且它们在理论上每次使用时都会重新计算。但是,大多数现代编译器都会看到std::cout << 4.0f*atan(1.0f);并在编译时进行计算,并为std::cout << 3.14159265f;发出汇编,因此代码与预先计算的速度一样快。

无关,#include 也是复制粘贴的东西,这就是我们需要包含警卫的原因。

答案 1 :(得分:3)

#define将直接替换文字。因此,只要你PI,它就会被4.0f*atan(1.0f)取代。我怀疑编译器会在代码生成过程中对其进行优化,但唯一真正知道的方法是编译它并检查程序集。

我发现这个little online tool将采用c ++代码并生成程序集输出。如果启用优化,您将看到生成的显示PI的代码已经消失,现在只是一个被引用的常量。

答案 2 :(得分:0)

当预处理器运行时,它会用PI替换4.0*atan(1.0f)的每个实例。