0

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

我们支持一些遗留的本地 C 代码,其中包含以下内容......(不要问我为什么要 VOID/void)

#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 
4

2 回答 2

5

是的,在 C89、C99 和 C11 中可以免费订购。但是C11 6.11.5说它static是一个过时的功能:

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

排序比通常认为的要自由得多,但您不应该(ab)使用它。例如,这种可憎的行为也是C11中的有效声明:

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

虽然更好地写成类似

static volatile const unsigned long long int _Alignas(double) ***a;
于 2017-07-25T07:35:26.683 回答
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();

无效的。

于 2017-07-25T07:39:00.027 回答