为什么 const int 需要 extern 而 const char* 不需要
Why is extern required for const int but not for const char*
我对 extern.cpp 文件中定义的 int
和 char*
为什么需要或不需要 extern
感到困惑。我有以下测试程序:
// extern.cpp
extern const int my_int = 1;
const char* my_str = "FOO";
// main.cpp
#include <iostream>
extern const int my_int;
extern const char* my_str;
int main() {
std::cout << my_int;
std::cout << my_str;
return 0;
}
如果我从 extern const int my_int = 1;
中删除 extern
,那么我会得到 undefined reference to 'my_int'
。如果我将 extern 添加到 const char* my_str = "FOO";
,那么我会收到警告 'my_str' initialized and declared 'extern'
。为什么我在 my_int
上需要 extern
但将其添加到 my_str
会产生警告?
这是 gcc 10.1.0 上的 C++17。具体命令为:
/usr/bin/g++-10 -g -std=gnu++17 -o main.cpp.o -c main.cpp
/usr/bin/g++-10 -g -std=gnu++17 -o extern.cpp.o -c extern.cpp
/usr/bin/g++-10 -g main.cpp.o extern.cpp.o -o TestExtern
这是由于 my_int
和 my_str
变量的 linkage 不同造成的。
my_int
是命名空间范围内的 const
限定变量,这意味着它默认具有内部链接。换句话说,它的可见性仅限于当前的翻译单元,除非你标记它extern
。此外,内部链接常量必须有一个初始值设定项。
my_str
,另一方面,不 const
-合格。不要被指针类型中的 const
限定符混淆,因为该限定符是指针类型的一部分。指针本身是可变的,您可以在 运行 时间内为其分配不同的值。由于这是命名空间范围内的非const
变量,它具有外部链接,因此在整个程序范围内引用单个指针对象。
我对 extern.cpp 文件中定义的 int
和 char*
为什么需要或不需要 extern
感到困惑。我有以下测试程序:
// extern.cpp
extern const int my_int = 1;
const char* my_str = "FOO";
// main.cpp
#include <iostream>
extern const int my_int;
extern const char* my_str;
int main() {
std::cout << my_int;
std::cout << my_str;
return 0;
}
如果我从 extern const int my_int = 1;
中删除 extern
,那么我会得到 undefined reference to 'my_int'
。如果我将 extern 添加到 const char* my_str = "FOO";
,那么我会收到警告 'my_str' initialized and declared 'extern'
。为什么我在 my_int
上需要 extern
但将其添加到 my_str
会产生警告?
这是 gcc 10.1.0 上的 C++17。具体命令为:
/usr/bin/g++-10 -g -std=gnu++17 -o main.cpp.o -c main.cpp
/usr/bin/g++-10 -g -std=gnu++17 -o extern.cpp.o -c extern.cpp
/usr/bin/g++-10 -g main.cpp.o extern.cpp.o -o TestExtern
这是由于 my_int
和 my_str
变量的 linkage 不同造成的。
my_int
是命名空间范围内的 const
限定变量,这意味着它默认具有内部链接。换句话说,它的可见性仅限于当前的翻译单元,除非你标记它extern
。此外,内部链接常量必须有一个初始值设定项。
my_str
,另一方面,不 const
-合格。不要被指针类型中的 const
限定符混淆,因为该限定符是指针类型的一部分。指针本身是可变的,您可以在 运行 时间内为其分配不同的值。由于这是命名空间范围内的非const
变量,它具有外部链接,因此在整个程序范围内引用单个指针对象。