Почему я могу получить доступ к статической переменной в другом файле? - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть 2 файла:

a.c
b.c

ac:

#include <stdio.h>
#include "b.c"

int main()
{
    printf("%s", B_VAR);
    return 0;
}

bc:

static char B_VAR[] = "Hello world!\n";

Скомпилируйте и запустите:

jonathan:~/code/staticDemo$ gcc a.c -o test
jonathan:~/code/staticDemo$ ./test
Hello world!

У меня сложилось впечатление, что static сделает B_VAR ограниченным только b.c, но, похоже, это сработает.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Файлы ac и bc не компилируются независимо друг от друга. Вы включаете bc в ac. То, что компилятор видит после предварительной обработки для ac, выглядит следующим образом:

// contents of stdio.h
static char B_VAR[] = "Hello world!\n";

int main()
{
    printf("%s", B_VAR);
    return 0;
}

Так что же на самом деле делает static переменную / функцию локальной для компиляцииЕдиница, в которой находится , может состоять из одного или нескольких исходных файлов, которые включены вместе.

Если бы вы удалили include и скомпилировали два файла по отдельности, то вы бы увидели ошибку.

0 голосов
/ 12 ноября 2019

Используемое здесь ключевое слово static делает переменную локальной для «единицы перевода», а не для файла. Директива #include вытягивает все содержимое именованного файла в текущий блок перевода. Так что да, B_VAR доступен.

Чтобы создать программу с использованием нескольких единиц перевода, вы должны пропустить #include "b.c" и вместо этого передать оба исходных файла драйверу компилятора:

$ gcc a.c b.c -o test

Обычная практика - никогда не #include исходный файл, только заголовочные файлы. Когда проект усложняется, включение исходного файла через несколько других файлов приведет к множественным ошибкам определения.

...