为什么C++编译器允许 extern 关键字与定义相结合
Why does the C++ compiler allow extern keyword combined with definition?
我不小心在使用 extern
关键字时出错,然后发现编译器允许我的代码行。为什么允许以下程序?编译器是否去除了 extern 关键字?它甚至没有发出警告。
#include <iostream>
extern void test() { std::cout << "Hello world!" << std::endl; };
int main()
{
test();
}
这并不罕见,事实上,C++内部做同样的事情,请注意 1.4/6 所说的:
库中的模板、类、函数和对象具有外部链接
库中的模板显然也有定义。他们为什么不呢!
看看 3.1/2 和 3.4/2(强调后加)怎么说:
声明是一个定义,除非它声明一个函数而不指定函数的主体 (8.4),[或] 它包含 extern 说明符 (7.1.1) 或链接规范25 (7.5),并且既不是初始值设定项也不是函数体
[...]
当一个名称有外部链接时,它所表示的实体可以用其他翻译单元的范围或同一翻译单元的其他范围的名称来引用。
你的声明有一个函数体,所以它是一个定义,这是明确、完全允许的。该函数具有外部链接,这意味着您可以通过另一个翻译单元中范围内的名称来引用它,但您不需要这样做。
在当前的翻译单元中,您仍然可以完全按其名称来称呼它,这就是您正在做的事情。
请注意,命名空间范围内有一个关于名称的子句,因此无论如何,您对 extern
关键字的使用都是多余的。
相关文章:
- 如何确保C++函数在定义之前声明(如override关键字)
- 在 c++ 中正确定义"this"关键字?
- 只要我不包含一个标题,重新定义C++关键字合法吗
- 如何使用 "using" 关键字定义函数原型/签名
- 设置自定义收集器时不会提升::log尊重关键字::max_size吗?
- 如何添加自定义关键字以 clang 格式被视为"class"?
- 为什么静态成员函数定义不能有关键字"static"?
- C++ 包含中的"未定义"模块关键字
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 虚拟关键字的使用与C++中的简单重新定义
- 在构造函数中使用关键字 "this" 时定义复制构造函数
- 我应该在源文件之间共享的常量的定义中添加关键字"extern"吗
- 如果我返回const定义的对象,为什么const关键字被取消资格
- 如果我在标题文件中使用关键字的声明,则应该在定义本身中包含相同的关键字
- 具有多个定义时,对于外部关键字没有错误
- C++:定义类函数的.cpp文件中实例本身的表示关键字
- 为什么我应该使用"typename"关键字来定义?
- 错误 RC2104:未定义的关键字或键名称:DS_SETFONT
- 重新定义(#define)保留的c++关键字
- Extern关键字定义静态数据成员和成员函数,c++