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

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

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

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

Ответы [ 7 ]

6 голосов
/ 20 марта 2009

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

3 голосов
/ 20 марта 2009

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

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

3 голосов
/ 20 марта 2009

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

Как правило, компоновщик не делает предупреждений для code-gen.

3 голосов
/ 20 марта 2009

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

2 голосов
/ 20 марта 2009

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

1 голос
/ 28 февраля 2011

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

LOCAL_CFLAGS + = -Werror .

1 голос
/ 20 марта 2009

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

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

...