Wak*_*zil 11 c++ linkage language-lawyer c++11
显然,从§3.3.1/ 4开始,这个代码片段无法编译,因为它包含两个A
在全局命名空间中具有相同名称的不同实体,extern int A;
并且static int A = 101;
.也就是说,一个有外部,另一个有内部联系.
#include <iostream>
extern int A;
static int A = 101;
class A{};
int main()
{
std::cout << A << '\n';
}
Run Code Online (Sandbox Code Playgroud)
那么为什么这个代码会编译?
#include <iostream>
static int A = 101;
extern int A;
class A{};
int main()
{
std::cout << A << '\n';
}
Run Code Online (Sandbox Code Playgroud)
编辑
我认为这个被认为是重复的问题的接受答案基本上说,在第二个片段中,变量A
仍然有内部联系,尽管extern
声明.但这与我在下面对@dyp的评论中提到的第3.5/4段不一致.
§3.5/ 4:
未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接.所有其他名称空间都有外部链接.具有名称空间作用域的名称上面没有给出内部链接,如果是名称,则具有与封闭名称空间相同的链接
- 一个变量; 要么
...
编辑1:
OP使用§3.5/ 6来证明他对另一个问题的回答.
§3.5/ 6(强调我的):
在块作用域中声明的函数的名称和由块作用域 extern声明声明的变量的名称具有链接.如果存在具有相同名称和类型的链接的实体的可见声明,忽略在最内部封闭命名空间范围之外 声明的实体,则块范围声明声明该实体并接收先前声明的链接.如果存在多个这样的匹配实体,则该程序是不正确的.否则,如果未找到匹配的实体,则 块范围实体接收外部链接.
很显然,这个答案并不适用于我的问题显示的片段,作为变量的声明A
都没有阻止范围的声明.
编辑2:
具有"就绪"状态的此问题表示应删除§7.1.1/ 7,因为它是错误的.
extern
说明符不要求名称具有外部链接。
extern int A;
是具有外部链接的名称声明A
- 但外部链接是隐含的,因为它是命名空间范围内的声明(在未命名的命名空间之外)。
static int A
; 声明具有内部链接的名称。
两个声明对于这种联系存在分歧,因此出现了错误。
在这里,我们首先声明,即一个具有内部链接的static int A;
名称。A
该声明extern int A;
不声明A
外部链接,它只是重新声明通过名称查找找到的名称。
[dcl.stc]/7
给定实体的连续声明所暗示的联系应一致。也就是说,在给定范围内,声明相同变量名或相同函数名重载的每个声明应暗示相同的链接。然而,给定的一组重载函数中的每个函数可以具有不同的链接。
[例子:
Run Code Online (Sandbox Code Playgroud)static char* f(); // f() has internal linkage char* f() // f() still has internal linkage { /* ... */ } char* g(); // g() has external linkage static char* g() // error: inconsistent linkage { /* ... */ } // [left out some examples with `inline`] static void n(); inline void n(); // internal linkage static int a; // a has internal linkage int a; // error: two definitions static int b; // b has internal linkage extern int b; // b still has internal linkage int c; // c has external linkage static int c; // error: inconsistent linkage extern int d; // d has external linkage static int d; // error: inconsistent linkage
--结束示例]
归档时间: |
|
查看次数: |
336 次 |
最近记录: |