为什么 const int 需要 extern 而 const char* 不需要

Tho*_*son 6 c++ extern c++17

我对为什么在我的 extern.cpp 文件的定义中需要extern或不需要intvs感到困惑char*。我有以下测试程序:

// extern.cpp
extern const int my_int = 1;
const char* my_str = "FOO";
Run Code Online (Sandbox Code Playgroud)
// 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我删除externfromextern const int my_int = 1;那么我得到undefined reference to 'my_int'. 如果我将 extern 添加到const char* my_str = "FOO";然后我会收到警告'my_str' initialized and declared 'extern'。我为什么需要externmy_int,但将它添加到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
Run Code Online (Sandbox Code Playgroud)

And*_*hev 12

这是由不同造成联动my_intmy_str变量。

my_intconst命名空间范围内的-qualified 变量,这意味着它默认具有内部链接。换句话说,它的可见性仅限于当前翻译单元,除非您将其标记为extern。此外,内部链接常量必须有一个初始值设定项。

my_str,在另一方面,没有 const-qualified。不要被const指针类型中的限定符混淆,因为该限定符是指向类型的一部分。指针本身是可变的,您可以在运行时为其分配不同的值。由于 thisconst在命名空间范围内是一个非变量,因此它具有外部链接,因此在整个程序范围内引用单个指针对象。

  • @cdho 西常量 最差常量 东常量 最佳常量 (2认同)
  • @Yakk-AdamNevraumont [一个常量,两个常量,红色常量,蓝色常量](https://genius.com/Dr-seuss-one-fish-two-fish-red-fish-blue-fish-annotated)。 (2认同)