2) const int foo = 42;
Run Code Online (Sandbox Code Playgroud)
这是一个int变量,其值无法更改.
1) static const int foo = 42;
Run Code Online (Sandbox Code Playgroud)
这与2)相同,但它只在它所在的源代码文件中可见.因此,您不能在另一个.cpp文件中使用它,例如,如果您单独编译它们然后链接在一起.通过将static与变量和函数一起使用,您可以让编译器更好地优化它们,因为编译器可以依赖于它知道使用该变量或函数的所有情况.static这个词在不同情况下有不同的含义,但如果你在全局层面使用它,这就是它的行为.如果在函数内部使用它,它具有不同的含义.然后,这意味着该变量仅初始化一次并且无论代码执行通过该定义多少次,它都会保留在内存中.如果你不同时使用const,这意味着更多的意义,因为那样你就可以改变变量的值,即使你退出那个变量可见的代码部分,它也会"记住"那个值(称为"范围")并重新输入.
3) #define foo 42
Run Code Online (Sandbox Code Playgroud)
这是一个预编译器宏.因此,在将代码提供给实际编译器之前,预编译器将使用数字42替换所有"foo".几年前人们使用这种方法,因为它比const变量更快,但现在它们同样快.
static const int foo = 42;
Run Code Online (Sandbox Code Playgroud)
这取决于它的位置和使用的语言:
如果这是在命名空间范围(在C++中)或文件范围(在C中)的声明,那么它声明并定义一个名为foo具有内部链接的const限定对象(这意味着该名称foo仅引用当前转换中的此对象)单位,而不是其他翻译单位).
如果这是函数作用域中的声明(在C或C++中),那么它声明并定义一个名为const-qualified的对象foo,该对象没有链接(本地声明的变量没有链接),该对象的生命周期是程序(这意味着在每次调用函数时,都foo指的是同一个对象).
如果这是C++并且这是一个类内部的声明,那么它声明但不定义一个const限定的静态数据成员foo,该成员名为具有外部链接(这意味着该名称foo(在这种情况下,当使用类名限定时) )在任何翻译单元中使用时指的是同一个对象).
const int foo = 42;
Run Code Online (Sandbox Code Playgroud)
这取决于您使用的语言和声明出现的位置.如果声明在命名空间或文件范围,那么
在C++中,它声明并定义了一个名为const的限定对象foo,该对象具有内部链接(const暗示了C++中的内部链接).
在C中,它声明并定义了一个名为const的限定对象foo,该对象具有外部链接(这const并不意味着C中的内部链接).
在C++和C中,如果此声明位于函数范围,则此声明并定义一个名为const的限定的局部变量foo,该变量没有链接.
#define foo 42
Run Code Online (Sandbox Code Playgroud)
这没有定义一个对象; 它定义了一个名为的宏foo,它被一个令牌组成的令牌序列所取代42.