Сводка на C сбивает с толку как ад. У меня есть переменная: «int qwe». Этот var должен быть видимым в одном или нескольких файлах - f1.c в этом случае, но не в другом f2.c.C - extern, статические, включают
сказать, что я: main.c, f1.c, f2.c, header.h
главное: вызова f1(); вызов f2();
Заголовок:
#ifndef HEADER_INCLUDED
#define HEADER_INCLUDED
int qwe = 1;
void f1();
void f2();
#endif // HEADER_INCLUDED
f1.c:
#include <stdio.h>
extern int qwe;
void f1(){
printf("In f1: %d\n", qwe);
}
f2.c:
#include <stdio.h>
static int qwe = 2;
void f2(){
printf("In f2: %d\n", qwe);
}
Теперь это становится запутанным. Существует определение и декларация. Я определил qwe в заголовке, объявив его в файле f1.c. Это верно? Должно ли определение быть в заголовке и декларации в f1.c вместо? Я попробовал последний случай, но получил ошибку - «множественное определение qwe». Когда я удалил директиву #include из f1.c, он работал ... Он также работает, когда я удаляю ключевое слово extern. Является ли extern избыточным?
f2.c Я предполагаю, что все в порядке и ведет себя так, как ожидалось, или это так? Но если я поставлю заголовок #include с заголовком, он сломается. Почему это?
Когда я должен использовать #include в исходных файлах? Если я не включаю его f1.c или f2.c, он работает ...
Также, если я определяю переменную как статическую внутри функции, например static int i = 0; Эта переменная не будет уничтожена, если функция существует, она сохранит ее память и данные. И в следующий раз, когда эта же функция будет вызвана, у нее будет доступ к ней, правильно? Но var не будет повторно инициализирован до 0, т. Е. Строка, где определяется, не будет выполняться. Верный?
Жизнь плющит меня :(
Забыто явно уточнить, что если #include «header» помещается в f1.c, не удается скомпилировать с ошибкой: «множественное определение qwe» и «первое определение здесь». Почему это? – user2092119
Файл заголовка должен содержать объявление, а не определение. Положите определение в f1.c. Либо не включать заголовочный файл в f2.c, либо скрывать объявление с помощью # #define qwe qwehidden. – chqrlie
Правило большого пальца: если вы когда-либо обнаруживаете, что используете ключевое слово 'extern' для непостоянных переменных, ваш дизайн программы нарушен. – Lundin