c++ - 变量只能全局“声明”,不能修改/(单独初始化)
问题描述
免责声明:
- 这可能是一个非常微不足道的问题(尽管我找不到答案),并且
- 一个纯粹的理论问题(我从来不需要这样做,也从未见过使用这种结构的代码,但我只是好奇这是如何/为什么会以这种方式发生的。)
- 双
C/C++
标签,因为我在 C 和 C++ 上测试了这段代码,它只有 4 行代码(唯一的区别是在给出错误gcc/clang
的同时给出警告。)g++/clang++
背景:
在回答另一个问题时,我开始思考为什么OP不能修改public static
变量。我考虑了一下,然后进一步减少了问题,我可以看到相同的效果,但不需要任何类或静态成员变量。
问题:那么下面的代码可以重现观察结果。
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++ 没有该规则,因此这显示为一个错误的函数之外的语句。
推荐阅读
- java - 有没有办法计算 txt 文件中的常量字符串和字符串之间的汉明距离?
- java - Spring Data JPA按连接表@OrderColumn排序?
- mysql - 使用 INDEX 优化 SQL 查询
- java - 自动向下滚动 textarea JAVA(并将图像添加到特定区域)
- php - quoted_printable_decode 一些带重音的单词返回 �
- c# - ExecuteAsync 不会将控制权返回给调试器
- i18next - 如何使用不同的语言环境调用 i18next.tr 函数?
- sql-server - 在 SQL Server 中对 SQLCLR 程序集进行逆向工程
- python - 获取另一个系列中系列的出现次数
- mysql - 内连接不使用覆盖索引