gpt4 book ai didi

c++ - 为什么 C++ 编译器允许 extern 关键字与定义相结合?

转载 作者:太空狗 更新时间:2023-10-29 21:19:12 24 4
gpt4 key购买 nike

我不小心在使用extern 关键字时出错,然后发现编译器允许我的代码行。为什么允许以下程序?编译器是否去掉了 extern 关键字?它甚至不发出警告。

#include <iostream>

extern void test() { std::cout << "Hello world!" << std::endl; };

int main()
{
test();
}

最佳答案

这并不罕见,事实上,C++ 在内部做完全相同的事情,请注意 1.4/6 所说的:

The templates, classes, functions, and objects in the library have external linkage

库中的模板显然也有定义。他们为什么不呢!

看看 3.1/2 和 3.4/2(强调)必须说什么:

A declaration is a definition unless it declares a function without specifying the function’s body (8.4), [or] it contains the extern specifier (7.1.1) or a linkage-specification25 (7.5) and neither an initializer nor a functionbody
[...]
When a name has external linkage , the entity it denotes can be referred to by names from scopes of other translation units or from other scopes of the same translation unit.

你的声明有一个函数体,所以它是一个定义,这是明确的,完全允许的。该函数具有外部链接,这意味着您可以通过另一个翻译单元中范围内的名称引用它,但您不需要这样做。 p>

在当前的翻译单元中,您仍然完全可以通过它的名字来调用它,这就是您正在做的事情。

请注意,在命名空间范围内有一个关于名称的子句,因此您对 extern 关键字的使用无论如何都有些多余。

关于c++ - 为什么 C++ 编译器允许 extern 关键字与定义相结合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28085557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com