Я прошел через следующие вопросы:если глобальная переменная имеет внешнюю связь по умолчанию, то почему мы не можем получить доступ к ней напрямую в другом файле?
- Global variable in C are static or not?
- Are the global variables extern by default or it is equivalent to declaring variable with extern in global?
Выше ссылки описывают, что если определить глобальную переменную в одном файле и не указано ключевое слово extern
они будут доступны в другой исходный файл из-за единицы перевода.
Теперь у меня есть file1.c
в том, что определили следующие глобальной переменной и функции:
int testVariable;
void testFunction()
{
printf ("Value of testVariable %d \n", testVariable);
}
В file2.c
имеют следующий код
void main()
{
testVariable = 40;
testFunction();
}
Теперь я получаю error: 'testVariable' undeclared (first use in this function
) - почему?
Примечание: оба файла используются в одной программе с использованием make-файла.
Согласно моему пониманию, функция и глобальная переменная имеют внешнюю связь по умолчанию. Таким образом, мы можем напрямую использовать его имя в другом файле, но переменная не может быть причиной?
У кого-нибудь есть идея?
EDIT:
С ниже ответ я получаю идею, что, как в случае функции старого компилятора догадается и добавить неявную декларацию, но в случае переменной не может. Также C99 удалены неявное объявление, но до сих пор я получаю предупреждение в режиме C99, как:
warning: implicit declaration of function ‘testFunction’.
Теперь пошли через ссылку ниже:
implicit int and implicit declaration of functions with gcc compiler
Он сказал, что компилятор принять его в качестве диагностических целей и не дать ошибку. Таким образом, компилятор может обрабатывать данные.
Но почему в случае переменной он не может обрабатываться дальше? Даже в случае функции, если компилятор работает, и если фактическое определение не существует, то при времени соединения оно не будет выполнено. Итак, какая польза для продвижения вперед?
Если компилятор считать, что каждая необъявленная переменная была 'extern' объект, вы никогда не могли бы получить предупреждения о недостающих деклараций.Кроме того, как компилятор узнает, какой тип объектов имеет объект? – EOF
@EOF то как работает компилятор в случае функции? – user2520119
В старых C-стандартах существует понятие * неявного описания функции *. Он удаляется из более новых стандартов и его следует избегать. Возможно, вы захотите скомпилировать с помощью опции-компилятора использовать современный C-стандарт и предупреждения. – EOF