这三个陈述之间有什么区别?
static const int foo = 42;
const int foo = 42;
#define foo 42
答案 0 :(得分:8)
2) const int foo = 42;
这是一个int变量,其值无法更改。
1) static const int foo = 42;
这与2)相同,但它只在它所在的源代码文件中可见。所以你不能在另一个.cpp文件中使用它,例如,如果你单独编译它们然后链接在一起。通过将static与变量和函数一起使用,您可以让编译器更好地优化它们,因为编译器可以依赖于它知道使用该变量或函数的所有情况。 static这个词在不同情况下有不同的含义,但如果你在全局层面使用它,这就是它的行为。如果在函数内部使用它,它具有不同的含义。然后,这意味着该变量仅初始化一次并且无论代码执行通过该定义多少次,它都会保留在内存中。如果你不同时使用const,这意味着更多的意义,因为那样你就可以改变变量的值,即使你退出那个变量可见的代码部分,它也会“记住”那个值(称为“范围“)并重新输入。
3) #define foo 42
这是一个预编译器宏。因此,在将代码提供给实际编译器之前,预编译器将使用数字42替换所有“foo”。几年前人们使用这种方法,因为它比const变量更快,但现在它们同样快。
答案 1 :(得分:5)
static const int foo = 42;
这取决于它的位置和使用的语言:
如果这是命名空间范围(在C ++中)或文件范围(在C中)的声明,那么它声明并定义一个名为foo
的const限定对象,它具有内部链接(这意味着名称foo
仅在当前翻译单元中引用此对象,而不在其他翻译单元中引用。
如果这是函数作用域中的声明(在C或C ++中),那么它声明并定义一个名为foo
的const限定对象,它没有链接(本地声明的变量没有链接)并且该对象的生命周期是程序的持续时间(这意味着在每次调用函数时,foo
都指向同一个对象)。
如果这是C ++并且这是类中的声明,那么它声明但不定义具有外部链接的名为foo
的const限定静态数据成员(这意味着名称foo
(在这种情况下,在使用类名称限定时)在任何翻译单元中使用时引用相同的对象。)
const int foo = 42;
这取决于您使用的语言以及声明出现的位置。如果声明位于命名空间或文件范围,则
在C ++中,它声明并定义了一个名为foo
的const限定对象,该对象具有内部链接(const
表示C ++中的内部链接。)
在C中,它声明并定义了一个名为foo
的const限定对象,该对象具有外部链接(const
并不意味着C中的内部链接。)
在C ++和C中,如果此声明位于函数作用域,那么这将声明并定义一个名为foo
的const限定的局部变量,该变量没有链接。
#define foo 42
这不定义对象;它定义了一个名为foo
的宏,它由一个令牌42
组成的令牌序列替换。
答案 2 :(得分:2)
const
修饰符用于指定foo
是常量。即初始化后,其值可能不会改变。
static
关键字用于告诉编译器即使超出范围,也应保留您声明为静态的变量的值。这意味着如果在函数内部声明一个变量static,即使函数返回后它的值也会被记住(与自动变量不同)。它还用于告诉编译器变量仅在当前编译单元中可见。这意味着如果你声明一个顶级变量/函数静态,那么从你正在编译的其他文件中看不到它。
#define
是一个预处理程序指令,在实际编译发生之前,对所有(在这种情况下)foo
的所有实例执行文本替换。编译器甚至看不到foo
。它只能看到42
。
答案 3 :(得分:1)
前两个声明一个名为foo
的变量,而第三个声明不声明任何变量,它只是一个别名42.
在C中,第一个是file-cope变量,而第二个是外部链接,意味着它可以从另一个翻译单元引用!
但在C ++中,(第一个和第二个)都是相同的,因为在C ++ const
默认为static
;两者都有内部联系!
答案 4 :(得分:0)
static const int foo = 42;
一个常量静态变量。只要变量存在,就不能更改初始化的值。作为静态变量,即使包含声明它的文件,该变量也不能包含在任何文件中。如果这是一个类的成员,那么该类的所有实例只存在一个变量副本。
const int foo = 42;
一个常量变量,其中一旦初始化的值保持不变并且无法更改。
#define foo 42
不是变量,而是符号常量。所以不允许&foo
之类的操作。 foo
仅作为42的别名。与其他人不同,它由预处理器处理。
答案 5 :(得分:-2)
static
是什么意思?提示:fgbentr fcrpvsvre
const
是什么意思?提示:ernq-bayl inevnoyr
#define
做什么?它在编译的哪个阶段发生?这对生成的代码意味着什么?