我注意到一个非常奇怪的行为,如果标准的话,我会非常乐意利用(我想用它来解释它并且与问题无关).
行为是:
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标准草稿;-)