C++ 声明一个函数是静态的,以后是非静态的:它是标准的吗?
我注意到一个非常奇怪的行为,如果符合标准的话,我会非常乐意利用它(我想用它做的是相当复杂的解释,与问题无关) 这种行为是:C++ 声明一个函数是静态的,以后是非静态的:它是标准的吗?,c++,c,standards,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();
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:“在名称空间范围中声明的名称,没有
存储类说明符具有外部属性
联动装置,除非有内部联动装置
因为之前的声明“[或除非它是常量]
在第一种情况下,name
在名称空间范围(特别是全局名称空间)中声明。因此,第一个声明改变了第二个声明的链接
禁止反向,因为:
7.1.1/7:“连续声明所暗示的特定
实体应同意”
因此,在第二个示例中,第一个声明具有外部链接(按7.1.1/6),第二个声明具有内部链接(显式),这两个声明并不一致
你也问C,我想也是一样的。但我这里有C++书籍,而你也可以像我一样在线阅读C标准草案;-)p> 声明函数时,会自动使用您在函数原型上添加的限定符(或隐含的限定符) 因此,在第二种情况下,原型上缺少
static
,这意味着函数被定义为非静态函数,然后当它后来被声明为静态函数时,这是一个错误
如果您在原型中不使用返回类型,那么默认值将是
int
,然后您将再次得到void
返回类型的错误。同样的事情发生在