Почему gcc выдает ошибку неиспользуемой переменной для локальных переменных, но не для глобальных переменных?

У меня вопрос по gcc. Почему я получаю сообщение об ошибке неиспользуемой переменной, когда я определяю переменную локально в функции, но не когда переменная является глобальной в уникальном файле?

Я понимаю, что это может быть использовано для кого-то другого, но для этого мне нужно правильно поставить внешнее слово?

Заранее спасибо.


person Eduardo    schedule 19.03.2009    source источник


Ответы (7)


Если под «глобальным в уникальном файле» вы подразумеваете "int x;" вне какой-либо функции, то это не задача компилятора, чтобы обнаружить это, переменная должна быть доступна компоновщику на случай, если она понадобится другому блоку компиляции (например, errno).

Если вы имели в виду "static int x", где он не доступен компоновщику, это, вероятно, просто выбор, сделанный GCC. Я не думаю, что компиляторы обязаны уведомлять об этом, и это не наносит реального ущерба, кроме потери нескольких байтов в вашем адресном пространстве.

person paxdiablo    schedule 19.03.2009

Компилятор не может узнать, используется ли глобальная переменная — например, она может быть использована из модуля компиляции, написанного на совершенно другом языке.

person Community    schedule 19.03.2009
comment
Но чтобы сделать его видимым, мне нужно объявить его внешним правом?. - person Eduardo; 20.03.2009
comment
Нет, он виден по умолчанию. Внешний используется в других модулях компиляции, чтобы указать компоновщику искать глобальный объект в другом месте. - person Michael; 20.03.2009
comment
Нет, просто не объявляйте его статическим. Если вы хотите предупреждение, сделайте его статическим. - person Pete Kirkham; 20.03.2009
comment
Его нужно объявить только extern в модуле, который использует переменную, не обязательно в модуле, который определяет переменную. - person Michael Burr; 20.03.2009

Потому что глобальные переменные могут использоваться в любом другом месте, которое не известно компилятору. Например, во внешней библиотеке или программе.

person FerranB    schedule 19.03.2009

Неиспользуемые локальные переменные могут быть определены компилятором. Неиспользуемые глобальные переменные могут быть определены только компоновщиком, поскольку они могут быть общими для всех объектных файлов.

Как правило, компоновщик не выдает предупреждений о генерации кода.

person Michael    schedule 19.03.2009
comment
Как правило, если компоновщик собирается что-то делать с неиспользуемыми глобальными переменными, он удаляет их из образа. - person Michael Burr; 20.03.2009

Когда переменная является глобальной, компилятор не имеет полной видимости для всех единиц компиляции в проекте — переменная может быть изменена в другой единице компиляции. Компоновщик может сказать, что он не используется, возможно, он удалит его из объектного файла.

person 1800 INFORMATION    schedule 19.03.2009
comment
Я никогда не сталкивался с линкером, который удаляет что-то из объектных файлов. Возможно, из финального исполняемого файла. - person ; 20.03.2009

Потому что, если он глобальный, его может использовать другой модуль, который будет связан позже.

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

person Michael Burr    schedule 19.03.2009

Я столкнулся с тем же вопросом, когда я собирал dalvikVM в android2.3, и я получил ключ к точке. Это потому, что параметры компилятора слишком строгие:

LOCAL_CFLAGS += -Ошибка.

person user637592    schedule 28.02.2011