2013-12-15 3 views
3

Объявление переменной как статического в одном файле и объявление extern в другом файле - я думал, что это приведет к ошибке при связывании как внешняя переменная не будет отображаться ни в одном объекте, поскольку тот, который был объявлен в другом файле, был с классификатором static. Но каким-то образом компоновщик (renesas) не обнаружил ошибок и создал исполняемый файл.Две статические переменные с одним именем (два разных файла) и один из них один из них в любом другом файле

Если приведенная выше информация об использовании была правильной, что произойдет, если две переменные будут объявлены как статические в двух разных файлах, а другая в другом файле с объявлением extern? В этом случае две разные памяти будут созданы в двух разных объектах, но какая из них будет связана с другой переменной, была объявлена ​​как extern в другом файле (так как оба имени переменной одинаковы)?

file1.c

static int test_var; 
fn1() 
{ 
    test_var = 1; 
}  

file2.c

static int test_var; 
fn2() 
{ 
    test_var = 2; 
} 

file3.c

extern int test_var; 
fn3() 
{ 
    int x; 
    x = test_var; 
} 
+0

Так что показать фактический код. –

+0

@ H2CO3, обновленный код примера ... – Opener

+2

Не существует определения для 'test_var', объявленного' extern', и нет определения для 'main'. Мой компоновщик помещает обе ошибки. Пожалуйста, покажите пример _complete_. –

ответ

1

Ответ, вероятно, так, как вы сконфигурировали компоновщик. Если вы связываете библиотеку, все будет ОК, и file3.o будет иметь test_var ссылку UNDEFINED.

Если вы связываете приложение с этими 3 модулями, вы потерпите неудачу только потому, что отсутствие main() рутинных определений и нерешенных внешних будет считаться еще менее злым. :-)

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

4

В вашем примере, file3.c имеет абсолютно нет доступа к переменной test_var в любом file1.c o r file2.c. Вы должны получить ошибку связывания, если test_var не объявлен в пределах file3.c.

1

В файле file1.c и file2.c ключевое слово static означает, что переменная test_var - это размер файла. Это означает, что эта переменная доступна только в том файле, где она объявлена.

В файле3.c ключевое слово extern означает, что переменная объявлена ​​в другом файле.

Когда компилятор компилирует файл3.c, он будет отмечать переменную test_var в другом объектном файле, и все равно, где она. Таким образом, этот файл может быть скомпилирован, и ошибок не было. Но когда компоновщик обрабатывает эти объектные файлы, он обнаружит, что никакая переменная с именем test_var не может быть ссылкой на файл3, будет показана ошибка.

+0

'static' означает статическую привязку, а не область файла и декларацию' extern' в 'file3.c' означает, что есть определение этой переменной где-то еще, декларация уже существует. – effeffe

+0

@effeffe Прошу прощения за мою ошибку, я снова прочитал документ ISO, вы правы. – MicroAleX