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

问题描述

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

// 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 中删除 extern const int my_int = 1;,那么我得到 undefined reference to 'my_int'。如果我将 extern 添加到 const char* my_str = "FOO";,则会收到警告 'my_str' initialized and declared 'extern'。为什么我需要 extern 上的 my_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

解决方法

这是由 my_intmy_str 变量的不同 linkage 引起的。

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

另一方面,

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...