为什么在函数参数中使用静态变量声明函数在Windows中不是错误?

k53*_*3sc 3 c c++

我正在阅读有关静态和其他说明符的文档

在这里,它说

静态说明符仅允许在变量声明中(函数参数列表除外),函数声明(块作用域除外)和匿名联合声明.当在类成员的声明中使用时,它声明一个静态成员.在变量声明中使用时,它指定静态存储持续时间(除非伴随thread_local).在命名空间范围内的声明中使用时,它指定内部链接.

现在考虑一个类似的片段

int test(static int a )
{
     return a;
}

int main()
{

    test(5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是标准自己的完整声音.
此代码段在Windows和运行时编译警告

C4042:'a':存储类错误

但在Linux上出错(预期的行为)

test.cpp:2:错误:存储类说明符在参数声明
test.cpp中无效:2:错误:为参数't'指定的存储类

我的问题是,
为什么Windows编译器允许这种类型的违规,他们有任何我看不到的优势吗?
这在运行时如何表现?

我几乎没有猜测也许,它们都不是实际行为,
1>静态关键字被忽略
2>每当调用函数时都会创建此变量a的多个副本(在循环中调用函数会导致程序出现内存问题. )
3>只为该函数创建一个静态实例,并且每次调用该函数时都使用相同的变量(循环调用程序不会因内存较少而导致崩溃)

Mal*_*ery 5

根据MSDN文档,它将被标准存储类替代.这是:

  • extern,如果标识符是一个函数.
  • auto,如果identifier是形式参数或局部变量.
  • 如果identifier是全局变量,则没有存储类.

参考:http://msdn.microsoft.com/en-us/library/z9d31kt4.aspx

GCC 4.8.2产生以下致命错误:

  • 错误:存储类说明符在参数声明中无效
  • 错误:为参数'a'指定的存储类

clang 3.5显示以下致命编译错误:

  • 错误:函数声明中的存储类说明符无效
  • 警告:没有以前的函数'test'原型[-Wmissing-prototypes] |

根据1.4节[intro.compliance],C++标准仅需要"诊断消息":

  • 如果某个程序不违反本国际标准中的规则,则符合条件的实施应在其资源限制内接受并正确执行该程序.
  • 如果程序包含违反任何可诊断规则或本标准中描述的构造的发生,如果实现不支持该构造,则 符合条件的实现应发出至少一条诊断消息.
  • 如果程序包含违反不需要诊断的规则,则本国际标准不要求对该程序的实施.

对于此警告,我建议通过删除静态来更正代码.