我注意到一种非常奇怪的行为,如果是标准的话,我会非常乐意利用它(我想用它来做解释相当复杂并且与问题无关)。
行为是:
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 */
}
那么,这是标准吗?我能指望其他编译器的行为方式相同吗?谢谢!
答案 0 :(得分:12)
C ++标准:
7.1.1 / 6:“在没有a的命名空间范围内声明的名称 storage-class-specifier有外部的 连接,除非它有内部联系 因为先前的声明“[或除非它是常数]。
在第一种情况下,name
在命名空间范围(特别是全局命名空间)中声明。因此,第一份声明改变了第二份声明的联系。
禁止反转因为:
7.1.1 / 7:“对某一特定内容的连续声明所暗示的联系 实体应同意“。
因此,在您的第二个示例中,第一个声明具有外部链接(通过7.1.1 / 6),第二个声明具有内部链接(显式),并且这些声明不同意。
你也问过C,我想它也是同样的事情。但我在这里有C ++书籍,而你就像我一样能够在线查看C标准草案; - )
答案 1 :(得分:3)
在声明函数时,会自动使用放在函数原型上(或隐含的)的限定符。
所以在你的第二种情况下,原型上缺少static
意味着函数被定义为非静态,然后当它被声明为静态时,这是一个错误。
如果您在原型中放弃返回类型,则默认值为int
,然后使用void
返回类型再次出现错误。 __crtapi
和__stdcall
以及__declspec()
(在Microsoft C编译器中)也会发生同样的事情。