Почему я не могу присвоить значения глобальным переменным вне функции в C? - PullRequest
0 голосов
/ 03 июня 2018

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

int i = 8;

int main(void)
{
  i = 9;     /* Modifies i */
  return 0;
}

Однако назначение глобальной переменной вне функции не работает!

int i = 8;

i = 9;  /* Compiler error */

int main(void)
{
  return 0;
}

Я получаю следующее сообщение об ошибке:

warning: data definition has no type or storage class
warning: type defaults to 'int' in declaration of 'i'
  error: redefinition of 'i'
note: previous definition of 'i' was here
int i = 8;
    ^

Почему это происходит?

1 Ответ

0 голосов
/ 03 июня 2018

Это определение глобальной переменной с необязательной инициализацией для определенного значения:

int i = 8;

Обратите внимание, что это не код, который когда-либо выполняется, переменная будет просто установлена ​​в исходное значениесодержат 8. либо считают его «волшебным» (полезная модель для многих вещей, которые на самом деле не определены стандартом), либо представьте таблицы со значениями, копируемыми в ячейки памяти до выполнения любого кода.

Это фрагмент кода, у которого нет «фрейма», в котором он выполняется.
(Или вы намерены это сделать. Компилятор другого мнения, см. Ниже.)

i = 9;

Нет функции, содержащей его.Не ясно, когда это должно быть выполнено.Это то, что не нравится компилятору.
В C весь код должен находиться внутри функции и будет выполняться только в том случае, если эта функция вызывается, например, из main().

Другой язык, в основномте, которые выполняют «сценарии» путем их интерпретации (вместо того, чтобы код превращался в исполняемые файлы, например, компилятором), позволяют иметь код где угодно.C отличается.

Компилятор видит это по-другому:

i = 9;
  • он не внутри функции, поэтому он не может быть кодом
  • он выглядит какопределение переменной, предполагая, что вы имеете в виду int, то есть значение по умолчанию
  • , но полагаться на значения по умолчанию не очень хорошая идея, поэтому предупреждайте о пропущенном типе и что используется значение по умолчанию
  • также, если является определением, то это второе определение для i, теперь это действительно неверно, поэтому покажите ошибку и откажитесь от компиляции
  • просто для того, чтобы быть полезнымупомяните, где первое определение i равно

Вот как можно прочитать вывод компилятора, который вы цитировали.

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