免责声明:
- 这可能是一个非常微不足道的问题(虽然我找不到答案), and
- 一个纯粹的理论问题(我从来不需要这样做,也从未见过使用此类构造的代码,但我只是好奇如何/为什么会发生这种情况。)
- The
C/C++
双标签,因为我在 C 和 C++ 上测试了这部分代码,它只有 4 行代码(唯一的区别是gcc/clang
发出警告g++/clang++
给出错误。)
背景:在回复另一个人的时候question https://stackoverflow.com/questions/54864947/qt5-error-colorkeymap-does-not-name-a-type/54867539#54867539,我开始思考为什么OP不能modify a public static
多变的。我想了一下,然后进一步简化了问题,我可以看到相同的效果,但不需要任何类或静态成员变量。
Question:那么下面的代码可以重现观察结果。
int global_n; // I know it can be initialized right away here also: int global_n = 1;
global_n = 2; // This does not compile in C++. In C it gives a warning about missing type-specifier
int main() {
global_n = 2; // This does compile in both C/C++ of course
}
这让我想到了我的问题:全局变量(因此static
变量/成员变量)只能在声明时直接初始化。但任何后续修改只能发生在函数内部。正确的?
这有什么具体原因吗?
在函数之外,不能有语句(即可执行代码行),只能有声明和定义。
如果是global_n = 2;
在全局范围内,C90 有一个遗留功能,即如果声明变量时没有类型,则该变量的默认类型为int
(C99 删除了该功能并需要一个类型)。这就是本例中发生的情况,这也是您收到有关类型缺失的警告的原因。
C++ 没有这个规则,因此这显示为函数外部的语句,这是一个错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)