Несколько объявлений и определений - PullRequest
3 голосов
/ 26 мая 2010

Содержимое X.c:

int i;
main ()
{
fun ();
}

Содержимое Y.c:

int i;
fun ()
{
}

Почему эти два файла компилируются без ошибок? (с использованием GCC)

Но если я использую int i = 10;, это выдает ошибку множественного определения.

Ответы [ 3 ]

3 голосов
/ 26 мая 2010

Вас могут заинтересовать этот вопрос и ответы. Ключевые слова: «предварительное определение».

Предварительные определения в C99 и ссылка

1 голос
/ 26 мая 2010

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

static int i = 10;

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

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

0 голосов
/ 26 мая 2010

Потому что есть разница между объявлением и определением. int i; не делает ничего, кроме введения имени. int i = 10;, с другой стороны, определяет i, следовательно, место в памяти должно быть зарезервировано для хранения значения, которому оно соответствует. Но компилятору невозможно узнать, какое значение соответствует i, так как вы хотите связать две области памяти с именем i.

Предполагается, что вы связываете эти файлы друг с другом, что не совсем понятно из вашего объяснения.

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