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

时间:2009-12-22 02:20:15

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

奇怪的是,逆产生编译时错误:

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

那么,这是标准吗?我能指望其他编译器的行为方式相同吗?谢谢!

2 个答案:

答案 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编译器中)也会发生同样的事情。