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

StackOverflow https://stackoverflow.com/questions/664414

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

Заранее благодарю.

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

LOCAL_CFLAGS += -Ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top