具有外部链接的编译器的不同行为
当我在 VC++ 10 上编译以下源代码时,具有静态链接的 i
被分配给 42
但在 G++ 4.5.1 上,source2.cpp 中具有外部链接的 i
被分配给 42
。
关于根据该标准确认行为的标准应该是什么或为什么?有什么想法吗?
// source1.cpp
#include <iostream>
static int i = 0;
int h();
void foo()
{
int i;
{
extern int i;
i = 42;
}
}
int main()
{
foo();
std::cout << i << std::endl;
std::cout << h() << std::endl;
}
// source2.cpp
int i;
int h() { return i; }
When I compile the following sources on VC++ 10, The i
with static linkage gets assigned to 42
But on G++ 4.5.1, The i
with external linkage in source2.cpp gets assigned to 42
.
Any ideas on what should be the standard confirming behavior according to the Standard or why?
// source1.cpp
#include <iostream>
static int i = 0;
int h();
void foo()
{
int i;
{
extern int i;
i = 42;
}
}
int main()
{
foo();
std::cout << i << std::endl;
std::cout << h() << std::endl;
}
// source2.cpp
int i;
int h() { return i; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
ISO/IEC 14882:2011 3.5/6:
在
foo()
的内部块中,声明int i;
隐藏了全局命名空间范围内的声明:static int i;
所以有内部块内没有可见的带有链接的i
。这意味着extern int i;
引用在紧邻foo()
的命名空间中具有外部链接的实体。该赋值应该影响具有外部链接(在
source2.cpp
中定义)的i
,它不应该对定义了内部链接的i
产生影响在source1.cpp
中。ISO/IEC 14882:2011 3.5/6:
Inside the inner block in
foo()
, The declarationint i;
hides the declaration at global namespace scope:static int i;
so there is no visiblei
with linkage inside the inner block. This means thatextern int i;
refers to an entity with external linkage in the namespace immediately enclosingfoo()
.The assignment should affect the
i
with external linkage (defined insource2.cpp
), it should have no effect on thei
with internal linkage defined insource1.cpp
.