请考虑以下示例代码:
File1.cpp
#include <iostream>
using namespace std;
static int x = 6; //Line no:5
int main()
{
int x = 10;
{
extern int x; //Line 1
x = x + 5;
cout << "x = " << x << "\n";
}
return 0;
}
由于Line1
中的外部声明,将访问静态变量x
而不是自动变量x
。但我得到以下编译器警告:
File1.cpp:5:警告:'x'已定义但未使用
即使有了这个警告,我也会得到x = 11
的预期输出,它是静态变量x
的值。
为什么编译器会发出上述警告?我使用的是GCC版本g++ (GCC) 3.4.6
答案 0 :(得分:5)
注意:如果您对所有行编号,那会更容易。
您正在使用未正确处理extern的旧版GCC。如果您使用的是现代版本,则会看到代码存在三个问题。
首先,不使用main()中的本地x(警告)。其次,不使用静态全局x(警告)。第三,外部x未定义(错误)。
要么你不应该声明全局x静态,要么你应该使用:: x而没有extern规范。
答案 1 :(得分:2)
此代码可能会编译,但不应链接。 extern int x;
内的main
声明告诉编译器使用一些变量x
,其位置是在外部定义的(即具有外部链接的x
)。没有这样的变数!文件范围声明static int x = 6;
告诉编译器不要给这个文件范围x
外部链接。
此程序不与更新版本的gcc(以及clang)相关联。
答案 2 :(得分:0)
似乎编译器实际上在抱怨本地x
,即使消息指向外部作用域中的x
。它可能是一个编译器错误,应该在更新版本的gcc中进行测试。在任何情况下,错误都不是警告本身,只是它引用的行号。
Visual Studio 2010根本不生成任何警告,除非我将警告级别提高到4.然后它会在本地定义上生成警告而不是静态警告:
警告C4189:'x':局部变量已初始化但未引用