订单号';静态';C中的函数关键字与返回类型说明符
希望这不是与C中“静态”函数含义相关的许多其他问题的重复 我们支持一些传统的本机C代码,其中包含以下内容。。。(不要问我为什么重新作废/作废) 假定预处理器将后者转换为订单号';静态';C中的函数关键字与返回类型说明符,c,static-methods,static-functions,C,Static Methods,Static Functions,希望这不是与C中“静态”函数含义相关的许多其他问题的重复 我们支持一些传统的本机C代码,其中包含以下内容。。。(不要问我为什么重新作废/作废) 假定预处理器将后者转换为 void static vLoMyMethod(); 编译器(VisualStudio2015,可能是相对普通的标志/设置,警告级别W3)对此似乎没有问题,尽管我的理解是“static”应该在返回类型说明符之前,即 static void vLoMyMethod(); 这些在语法上是等价的,并且都是正确的吗?如果不是,为什么
void static vLoMyMethod();
编译器(VisualStudio2015,可能是相对普通的标志/设置,警告级别W3)对此似乎没有问题,尽管我的理解是“static”应该在返回类型说明符之前,即
static void vLoMyMethod();
这些在语法上是等价的,并且都是正确的吗?如果不是,为什么编译器接受前一种可能不正确的语法
编辑1
谢谢你的回答。有趣的是,我不确定它们是否100%等效,并且在所有情况下都可以接受,阿拉巴马州:
char * static vLoMyMethod1(); // compiler complains about expecting 'type' (intellisense wants an identifier)
static char * vLoMyMethod2(); // compiler is fine
是的,C89、C99和C11中的订购是免费的。但是,w.r.t.
静态
这是一项过时的功能:
1将存储类说明符放置在声明中声明说明符开头以外的位置是过时的功能
排序比通常认为的要自由得多,但您不应该(ab)使用它。例如,C11中也有这种令人憎恶的东西:
_Alignas(double) volatile long int long unsigned const static *(*(*(a)));
虽然写得像这样更好
static volatile const unsigned long long int _Alignas(double) ***a;
根据标准,两种版本都可以: n1570(最新C11草案)§6.7:
声明:
声明说明符init声明器列表(opt);
静态断言声明
声明说明符:
存储类说明符声明说明符(opt)
类型说明符声明说明符(opt)
类型限定符声明说明符(opt)
函数说明符声明说明符(opt)
对齐说明符声明说明符(opt)
因此,任何声明说明符后面都可能跟有任何其他声明说明符
但是要注意,存储类说明符应该放在开头:
n1570§6.11.5:
存储类说明符在声明开头以外的位置
声明中的说明符是过时的特性
因此,未来的标准可能会
void static vLoMyMethod();
无效。我有点惊讶,我竟然找不到一个副本……从C11标准草案中
存储类说明符
和声明说明符
的语法和脚注可以看出,这种重新排序是有效的。奇怪的是,甚至inttypedefx代码>似乎是一个有效的声明。
void static vLoMyMethod();