【发布时间】:2016-10-11 16:41:26
【问题描述】:
在 C89 中,static 关键字会影响作用域吗?
我的软件负责人告诉我:
“在文件顶部标记为静态的变量在技术上不再具有全局范围。静态是范围限定符以及存储关键字。范围是 涵盖符号可见性的概念,尽管可见性是 自动编译以具有内在关联的存储持续时间 几乎所有语言。我的意思是你不能命名一个范围 这也没有定义 C/C++ 中的存储持续时间。表达 范围不是用户定义的,并且在 l-param 和 r-param 涵盖的 C/C++ 中 块作用域在 C/C++ 中由用户定义的主体完全词法化 范围在 C/C++ 中完全由用户定义的主体和 声明文件范围在 C/C++ 中技术上不存在,因为 全局变量和模块范围根据词典模块范围接管 是在 C/C++ 中使用 static 定义的关键字,其他范围词典更改 访问规则,但可见性仍然基于模块 Global 当没有其他范围适用时,范围是 C/C++ 中的默认值,并且是 词法由 extern 关键字控制问题是静态是 不仅仅是作为关键字的范围限定符。它是一个范围限定符和 记忆关键字。”
我很困惑。我一直认为静态与翻译单元之间的可见性和变量的存储持续时间有关。两者都与范围无关。不是这样吗? C++ 中的静态/作用域关系是否不同?
【问题讨论】:
-
“模块”? C 没有模块。
-
我为你们的团队感到非常抱歉。这个人显然不知道他/她在说什么。我也不会使用 C89 来教 C。
-
是的,static 关键字在 C 语言中有两个不同的用途。这似乎是这个家伙唯一正确的地方。他像这样使用“C/C++”的次数意味着某事是一个很好的线索。 C 中没有“全局范围”之类的东西。文件范围是您可以拥有的最大范围,因此
static不会影响符号的范围。它会影响存储时间和链接。 -
听起来您的软件主管和您一样困惑,并且正在大喊大叫,以使他看起来像是知道自己在说什么。
-
没有语言“C/C++”。如果您的领导不知道这一点并掩盖差异,那么她肯定处于错误的位置。他似乎也混淆了联系、范围和寿命。顺便说一句,什么是“内存关键字”?我没有发现这是标准。