作者:31號_K | 来源:互联网 | 2023-01-04 11:47
《C++PrimerPlus(第五版)中文版》P277:在C++(但不是在C语言)中,const对默认存储类型稍有影响。默认情况下,全局变量的链接性为外部的,但cons
《C++ Primer Plus(第五版)中文版》P277:
在 C++ (但不是在 C 语言)中,const 对默认存储类型稍有影响。默认情况下,全局变量的链接性为外部的,但 const 全局变量的链接性为内部的。也就是说,在 C++ 看来,全局 const 定义就像使用了 static 说明符一样。
测试代码(VS2010 /W4 /WX):
输出:
结论:
(1) const 变量的内部链接性使得其它文件中无法引用它。如,const int const_var2 = 2; ;
(2) 在定义常量时,使用 extern 关键字可覆盖默认的内部链接性。如,extern const int const_var = 1; ,在这种情况下,必须在所有使用该常量的文件中用 extern 关键字来声明它。这与常规外部变量不同,定义常规外部变量时,不必使用 extern 关键字,但在使用该常量的其它文件中必须使用 extern;
(3) 由于 const 变量的链接性是内部的,因此,可在不同文件中定义相同的变量而不会引起变量重复定义;且该常量仅隶属于定义它的文件,不同文件中常量的值可不同。如,const_var_def.cpp 中 const double const_var3 = 3.3; ,而 main.cpp 中 const double const_var3 = 33.33; 。
疑问:
(1) 错误提示中的 (?const_var2@@3HB) 和 (?const_var3@@3NB) 名字是根据什么规律解析得到的?
(2) 对于常量 const_var3,为什么不能在 Line17 等代码块中使用其前进行声明,而必须在 Line5 等代码块以外使用其前进行声明?g_foo 都可以!难道因为它是 const 变量?难道因为 Line5 位置的声明和其定义(Line24)位于同一作用域(scope)?困惑!
另外:
编译器给出的错误提示信息中使用了 "int const" ,而不是 "const int" ,虽然意义相同,但前者更容易理解,正如《C++ Templates》中所言。