顺序'静态'函数关键字vs C中的返回类型说明符

时间:2017-07-25 07:16:34

标签: c static-methods static-functions

希望这不是与静态'静态'的含义相关的许多其他问题的重复。 C中的函数。

我们支持一些包含以下内容的遗留原生C代码...(不要问我为什么要重新启用/无效)

#define VOID void
#define LOCAL static
...
VOID LOCAL vLoMyMethod();

据推测,预处理器将后者翻译为

void static vLoMyMethod();

编译器(Visual Studio 2015,可能是相对普通的标志/设置,警告级别W3)看起来很好,即使我的阅读是静态的'应该在返回类型说明符之前,即

static void vLoMyMethod();

这些语法是否相同且都正确?如果没有,为什么编译器接受前者可能不正确的语法?

修改1

到目前为止,感谢您的回答。有趣的是,我不确定它们是100%等效的,并且在所有场景中都是可以接受的,ala:

char * static vLoMyMethod1();   // compiler complains about expecting 'type' (intellisense wants an identifier)
static char * vLoMyMethod2();   // compiler is fine 

2 个答案:

答案 0 :(得分:4)

是的,订购在C89,C99和C11免费。但是C11 6.11.5说w.r.t. static这是一个过时的功能:

  

1声明中声明说明符开头之外的存储类说明符的位置是一个过时的功能。

排序比通常认为的要快得多,但你不应该(ab)使用它。例如,在C11中,这种憎恶也是a valid declaration

_Alignas(double) volatile long int long unsigned const static *(*(*(a)));

虽然写得好像是

static volatile const unsigned long long int _Alignas(double) ***a;

答案 1 :(得分:3)

根据标准,两个版本都很好:

n1570(最新的C11草案)§6.7:

declaration:
    declaration-specifiers init-declarator-list (opt);
    static_assert-declaration

declaration-specifiers:
    storage-class-specifier declaration-specifiers (opt)
    type-specifier declaration-specifiers (opt)
    type-qualifier declaration-specifiers (opt)
    function-specifier declaration-specifiers (opt)
    alignment-specifier declaration-specifiers (opt)

因此,任何声明说明符都可能后跟任何其他声明说明符。

但请注意,存储类说明符放在开头:

n1570§6.11.5:

  

除声明开头之外的存储类说明符的位置   声明中的说明符是一个过时的功能。

因此,未来的标准可能会呈现

void static vLoMyMethod();

无效。

相关问题