c – 为什么在函数参数中使用静态变量声明函数在Windows中不是错误?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – 为什么在函数参数中使用静态变量声明函数在Windows中不是错误?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2075字,纯文字阅读大概需要3分钟。
内容图文
![c – 为什么在函数参数中使用静态变量声明函数在Windows中不是错误?](/upload/InfoBanner/zyjiaocheng/954/e15b173a53ed420eb5132b5c97b9b20a.jpg)
我正在阅读有关静态和其他说明符的文档
here,它说
The static specifier is only allowed in the declarations of variables (except in function parameter lists ), declarations of functions (except at block scope), and declarations of anonymous unions. When used in a declaration of a class member, it declares a static member. When used in a declaration of a variable, it specifies static storage duration (except if accompanied by thread_local). When used in a declaration at namespace scope, it specifies internal linkage.
现在考虑一个类似的片段
int test(static int a )
{
return a;
}
int main()
{
test(5);
return 0;
}
这是标准自己的完整声音.
此代码段在Windows和运行时编译警告
C4042: ‘a’ : has bad storage class
但在Linux上出错(预期的行为)
test.cpp:2: error: storage class specifiers invalid in parameter declarations
test.cpp:2: error: storage class specified for parameter ‘t’
我的问题是,
为什么Windows编译器允许这种类型的违规,它们是否具有我看不到的任何优势?
这在运行时如何表现?
我几乎没有猜测也许,这些都不是实际行为,
1 GT; static关键字被忽略
2 – ;无论何时调用该函数,都会创建此变量a的多个副本(在循环中调用该函数会导致程序因内存问题而崩溃.)
3 GT;只为该函数创建一个静态实例,并且每次调用该函数时都使用相同的变量(循环调用程序不会因内存较少而导致崩溃)
解决方法:
根据MSDN文档,它将被标准存储类替代.这是:
> extern,如果标识符是一个函数.
> auto,如果identifier是形式参数或局部变量.
>如果标识符是全局变量,则没有存储类.
参考:http://msdn.microsoft.com/en-us/library/z9d31kt4.aspx
GCC 4.8.2产生以下致命错误:
> error:存储类说明符在参数声明中无效
> error:为参数’a’指定的存储类
clang 3.5显示以下致命编译错误:
> error:函数声明中的无效存储类说明符
>警告:没有以前的功能’test’原型
[-Wmissing的原型] |
C标准仅需要根据1.4节[intro.compliance]的“诊断消息”:
>如果程序不包含违反此规则的行为
国际标准,符合要求的实施应在其内部
资源限制,接受并正确执行该程序.
>如果程序包含违反任何可诊断规则或
本标准中描述的构造的发生
当实施不支持时,“有条件支持”
那个构造,
符合要求的实施方案应至少发布一条诊断信息.
>如果程序包含违反规则但没有诊断的规则
是必需的,本国际标准不要求
关于该程序的实现.
对于此警告,我建议通过删除静态来更正代码.
内容总结
以上是互联网集市为您收集整理的c – 为什么在函数参数中使用静态变量声明函数在Windows中不是错误?全部内容,希望文章能够帮你解决c – 为什么在函数参数中使用静态变量声明函数在Windows中不是错误?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。