Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 声明一个函数是静态的,以后是非静态的:它是标准的吗?_C++_C_Standards - Fatal编程技术网

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
返回类型的错误。同样的事情发生在代码> >代码> > ysSTDele> 和(SyoSuxScript)< /C>(在微软C编译器中)。< /P>我使用C++,但是我添加了一个C标记,因为我觉得它在C.是一样的。