c++ - 为什么 const int 需要 extern 而 const char* 不需要
问题描述
我对为什么在我的 extern.cpp 文件的定义中需要extern
或不需要int
vs感到困惑。char*
我有以下测试程序:
// 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
onmy_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_int
和my_str
变量引起的。
my_int
是const
命名空间范围内的 -qualified 变量,这意味着默认情况下它具有内部链接。换句话说,它的可见性仅限于当前翻译单元,除非您将其标记为extern
。此外,内部链接常量必须有一个初始化器。
my_str
,另一方面,不合格 const
。不要被const
指针类型中的限定符混淆,因为该限定符是指向类型的一部分。指针本身是可变的,您可以在运行时为其分配不同的值。由于 this 是命名空间范围内的非const
变量,因此它具有外部链接,因此指的是整个程序范围内的单个指针对象。
推荐阅读
- azure - 不满足使用 HTTP 条件标头指定的条件 Azure datalake gen2 using Python azure function
- javascript - Access-Control-Allow-Origin: 同源 & recaptcha & YouTube-视频
- android - 如何防止我的应用程序被系统杀死?
- python - 使用 pyenv 时无法添加任何带有诗歌的包
- visual-studio - 如何在 Visual Studio 中更改 UI 颜色,而不更改文本编辑器中的字体和文本颜色?
- ruby-on-rails - 检查是否调用了内部方法 - rspec
- bootstrap-4 - 如何使用 Bootstrap 进行响应式网页设计?
- r - 如何使用 ggplot 在 R 中绘制特定行?
- node.js - NextJS API 未发布到外部域
- php - 将条形码插入 CSV 文件