GCC编译器为定义和使用的静态变量发出警告

时间:2012-02-05 06:34:51

标签: c++ gcc compiler-warnings static-variables

请考虑以下示例代码:

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

3 个答案:

答案 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':局部变量已初始化但未引用