我正在阅读有关静态和其他说明符的文档
在这里,它说
静态说明符仅允许在变量声明中(函数参数列表除外),函数声明(块作用域除外)和匿名联合声明.当在类成员的声明中使用时,它声明一个静态成员.在变量声明中使用时,它指定静态存储持续时间(除非伴随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>只为该函数创建一个静态实例,并且每次调用该函数时都使用相同的变量(循环调用程序不会因内存较少而导致崩溃)
根据MSDN文档,它将被标准存储类替代.这是:
参考:http://msdn.microsoft.com/en-us/library/z9d31kt4.aspx
GCC 4.8.2产生以下致命错误:
clang 3.5显示以下致命编译错误:
根据1.4节[intro.compliance],C++标准仅需要"诊断消息":
对于此警告,我建议通过删除静态来更正代码.