Учитывая файлы:
// file: q7a.h static int err_code = 3; void printErrCode (); ///////////// END OF FILE ///////////////// // file: q7a.c #include <stdio.h> #include "q7a.h" void printErrCode () { printf ("%d ", err_code); } ///////////// END OF FILE ///////////////// // file: q7main.c #include "q7a.h" int main() { err_code = 5; printErrCode (); return 0; } ///////////// END OF FILE /////////////////
Вывод:
3
Мой вопрос, почему вывод не 5? Спасибо.
статические глобальные объекты имеют область действия, ограниченную текущим модулем компиляции. В этом случае у вас есть два модуля компиляции, по одному для каждого файла .c, и у каждого есть свой собственный err_code.
Ключевое слово static для err_code указывает на статическую связь, т. Е. Переменная является локальной для единицы перевода.
static
err_code
Когда вы компилируете файлы q7a.c и q7main.c по отдельности, будут две разные err_code переменные. Следовательно, функция printErrCode в q7a.c использует err_code, видимый только в области действия q7a.c.
q7a.c
q7main.c
printErrCode
Вывод не 5, , потому что глобальные переменные неверны .
Попробуйте это, не объявляя err_code нигде и не заменяя вызов в main():
main()
void printErrCode (int err_code) { printf ("%d ", err_code); } int main () { /* ... */ printErrCode(5); /* ... */ }