Статические поля - инициализация и изменение значения - PullRequest
0 голосов
/ 03 октября 2010

Учитывая файлы:

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

Ответы [ 3 ]

4 голосов
/ 03 октября 2010

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

3 голосов
/ 03 октября 2010

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

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

0 голосов
/ 03 октября 2010

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

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

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

int main ()
{
    /* ... */
    printErrCode(5);
    /* ... */
}
...