const 变量的链接性

《C++ Primer Plus(第五版)中文版》P277:

在 C++ (但不是在 C 语言)中,const 对默认存储类型稍有影响。默认情况下,全局变量的链接性为外部的,但 const 全局变量的链接性为内部的。也就是说,在 C++ 看来,全局 const 定义就像使用了 static 说明符一样。

 

测试代码(VS2010 /W4 /WX):

// const_var_def.cpp extern const int const_var = 1; const int const_var2 = 2; const double const_var3 = 3.3;

// main.cpp #include <iostream> extern const double const_var3; int main() { extern const int const_var; std::cout << "const_var = " << const_var << std::endl; // 下面两行代码导致: // error LNK2001: 无法解析的外部符号 "int const const_var2" (?const_var2@@3HB) // extern const int const_var2; // std::cout << "const_var2 = " << const_var2 << std::endl; // extern const double const_var3; // error LNK2001: 无法解析的外部符号 "double const const_var3" (?const_var3@@3NB) std::cout << "const_var3 = " << const_var3 << std::endl; extern double g_foo; std::cout << "g_foo = " << g_foo << std::endl; return 0; } const double const_var3 = 33.33; double g_foo = 5.5;

输出:

const_var = 1 const_var3 = 33.33 g_foo = 5.5

 
结论:
(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》中所言。

你可能感兴趣的:(c,测试,语言,iostream,编译器,templates)