声明一个静态函数和后来的非静态函数:它是标准的吗?

Tho*_*ini 6 c c++ standards

我注意到一个非常奇怪的行为,如果标准的话,我会非常乐意利用(我想用它来解释它并且与问题无关).

行为是:

static void name();
void name() {
    /* This function is now static, even if in the declaration
     * there is no static keyword. Tested on GCC and VS. */
}
Run Code Online (Sandbox Code Playgroud)

令人好奇的是,逆产生编译时错误:

void name();
static void name() {
    /* Illegal */
}
Run Code Online (Sandbox Code Playgroud)

那么,这个标准是否可以让我期望其他编译器的行为方式相同?谢谢!

Ste*_*sop 12

C++标准:

7.1.1/6:"在没有存储类说明符的命名空间范围内声明的名称具有外部链接,除非由于先前的声明"[或除非它是const]而具有内部链接.

在第一种情况下,name在命名空间范围(特别是全局命名空间)中声明.因此,第一份声明改变了第二份声明的联系.

禁止反转因为:

7.1.1/7:"对特定实体的连续声明所暗示的联系应予以同意".

因此,在您的第二个示例中,第一个声明具有外部链接(通过7.1.1/6),第二个声明具有内部链接(显式),并且这些声明不一致.

你也问过C,我想它也是同样的事情.但我在这里有C++书籍,而你就像我一样能够在线查看C标准草稿;-)