2010-10-03 4 views
0

Учитывая файлы:Статические поля - инициализация и изменение значения

// 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? Спасибо.

ответ

4

Статические глобальные объекты имеют область действия, ограниченную текущим блоком компиляции. В этом случае у вас есть два блока компиляции: по одному для каждого .c файла, и каждый имеет свой собственный err_code.

3

Ключевое слово static для err_code указывает статическую связь, то есть переменная локальна для единицы перевода.

Как вы компилируете файлы q7a.c и q7main.c отдельно, будут две переменные err_code. Следовательно, функция printErrCode в q7a.c использует err_code, видимую только в пределах области q7a.c.

0

Выход не 5, , потому что глобальные переменные являются плохими.

Попробуйте это, без объявления err_code в любом месте и заменить вызов в main():

void printErrCode (int err_code) 
{ 
    printf ("%d ", err_code); 
} 

int main() 
{ 
    /* ... */ 
    printErrCode(5); 
    /* ... */ 
} 
Смежные вопросы