Компилятор GCC выдает предупреждение для определенной и используемой статической переменной - PullRequest
0 голосов
/ 05 февраля 2012

Рассмотрим пример кода ниже:

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 ]

5 голосов
/ 05 февраля 2012

Примечание: было бы проще, если бы вы пронумеровали все строки.

Вы используете старую версию GCC, которая неправильно обрабатывает extern. Если вы используете современную версию, вы увидите три проблемы с вашим кодом.

Во-первых, локальный x в main () не используется (предупреждение). Во-вторых, статический глобальный x не используется (предупреждение). В-третьих, внешний х не определен (ошибка).

Либо вы не должны объявлять глобальную статическую x, либо вы должны использовать :: x без спецификации extern.

2 голосов
/ 05 февраля 2012

Этот код может компилироваться, но он не должен ссылаться.Объявление extern int x; внутри main указывает компилятору использовать некоторую переменную x, местоположение которой определяется извне (т. Е. x, которая имеет внешнюю связь).Там нет такой переменной!Объявление области видимости файла static int x = 6; указывает компилятору не давать этой области видимости файла x внешнюю связь.

Эта программа не связывается с более поздними версиями gcc (и также clang).

0 голосов
/ 05 февраля 2012

Кажется, что компилятор на самом деле жалуется на локальный x, хотя сообщение указывает на x во внешней области видимости. Это может быть ошибка компилятора, которая должна быть протестирована в более поздней версии gcc. В любом случае ошибка - это не само предупреждение, а номер строки, на которую оно ссылается.

Visual Studio 2010 вообще не генерирует никаких предупреждений, если я не подниму уровень предупреждений до 4. Затем он генерирует предупреждение для локального определения, а не статического:

предупреждение C4189: 'x': локальная переменная инициализирована, но на нее нет ссылок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...