具有外部链接的编译器的不同行为

发布于 2024-12-18 08:03:13 字数 560 浏览 2 评论 0原文

当我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苹果你个爱泡泡 2024-12-25 08:03:13

ISO/IEC 14882:2011 3.5/6:

在块作用域中声明的函数名称和由块作用域 extern 声明声明的变量名称具有链接。如果存在具有相同名称和类型的链接的实体的可见声明,忽略最内层封闭命名空间范围之外声明的实体,则块范围声明声明相同的实体并接收前一个声明的链接。如果存在多个这样的匹配实体,则该程序是格式错误的。否则,如果没有找到匹配的实体,块作用域实体将接收外部链接。

foo() 的内部块中,声明 int i; 隐藏了全局命名空间范围内的声明:static int i; 所以有内部块内没有可见的带有链接的 i 。这意味着 extern int i; 引用在紧邻 foo() 的命名空间中具有外部链接的实体。

该赋值应该影响具有外部链接(在 source2.cpp 中定义)的 i,它不应该对定义了内部链接的 i 产生影响在source1.cpp中。

ISO/IEC 14882:2011 3.5/6:

The name of a function declared in block scope and the name of a variable declared by a block scope extern declaration have linkage. If there is a visible declaration of an entity with linkage having the same name and type, ignoring entities declared outside the innermost enclosing namespace scope, the block scope declaration declares that same entity and receives the linkage of the previous declaration. If there is more than one such matching entity, the program is ill-formed. Otherwise, if no matching entity is found, the block scope entity receives external linkage.

Inside the inner block in foo(), The declaration int i; hides the declaration at global namespace scope: static int i; so there is no visible i with linkage inside the inner block. This means that extern int i; refers to an entity with external linkage in the namespace immediately enclosing foo().

The assignment should affect the i with external linkage (defined in source2.cpp), it should have no effect on the i with internal linkage defined in source1.cpp.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文