C中“静态”函数关键字与返回类型说明符的顺序

0 c static-methods static-functions

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

我们支持一些包含以下内容的传统原生 C 代码......(不要问我为什么要重新 VOID/void)

#define VOID void
#define LOCAL static
...
VOID LOCAL vLoMyMethod();
Run Code Online (Sandbox Code Playgroud)

据推测,预处理器将后者转换为

void static vLoMyMethod();
Run Code Online (Sandbox Code Playgroud)

编译器(Visual Studio 2015,大概是相对普通的标志/设置,警告级别 W3)对此似乎没问题,尽管我的理解是“静态”应该出现在返回类型说明符之前,即

static void vLoMyMethod();
Run Code Online (Sandbox Code Playgroud)

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

编辑 1

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

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

Ant*_*ala 5

是的,在 C89、C99 和 C11 中订购是免费的。然而C11 6.11.5说 wrtstatic它是一个过时的功能:

1 将存储类说明符放置在声明中声明说明符的开头以外的位置是过时的功能。

订购比通常认为的要自由得多,但您不应该(滥用)使用它。例如,这个可憎的在 C11 中也是一个有效的声明

_Alignas(double) volatile long int long unsigned const static *(*(*(a)));
Run Code Online (Sandbox Code Playgroud)

虽然写成这样更好

static volatile const unsigned long long int _Alignas(double) ***a;
Run Code Online (Sandbox Code Playgroud)