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

前端之家收集整理的这篇文章主要介绍了c – 声明一个静态函数和后来的非静态函数:它是标准的吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我注意到一个非常奇怪的行为,如果标准的话,我会非常乐意利用(我想用它来解释它并且与问题无关).

行为是:

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. */
}

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

void name();
static void name() {
    /* Illegal */
}

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

解决方法

C标准:

7.1.1/6: “A name declared in a namespace scope without a
storage-class-specifier has external
linkage unless it has internal linkage
because of a prevIoUs declaration” [or unless it’s const].

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

禁止反转因为:

7.1.1/7: “The linkages implied by successive declarations for a given
entity shall agree”.

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

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

猜你在找的C&C++相关文章