Разделение кода по файлам - C (СИ)
Формулировка задачи:
Собственно, вопрос в следующем. В программе нужен глобальный (видимый из нескольких .с файлов) массив структур. Я его выношу в заголовок следующего вида: и подключаю затем в файлах, где производится обращение к shlist: Как я понял, если таких файлов больше двух, то при сборке возникает multiple definition. Если же убрать #include в одном из файлов, будет обратное: "переменная не определена в текущей области видимости". Соответственно, вопрос: как правильно объявлять и использовать переменные при таком разделении?
/*ext_type.h*/ #ifndef EXT_TYPE_H #define EXT_TYPE_H struct sh { char name[20]; int x, y; //... } shlist[56]; #endif
/*main.c*/ #include "ext_type.h" void main() { //... shlist[10].x = 0; //... }
Решение задачи: «Разделение кода по файлам»
textual
Листинг программы
/*main.c*/ #include "ext_type.h" #include "anotherfile.h" //? sh shlist[56]; void main() { //... shlist[10].x = 0; //... modify(); } /*ext_type.h*/ #ifndef EXT_TYPE_H #define EXT_TYPE_H extern struct sh { char name[20]; int x, y; //... } shlist[56]; #endif /*anotherfile.c*/ #include "ext_type.h" void modify() { shlist[10].x += 2; } /*anotherfile.h ?*/ void modify();
Объяснение кода листинга программы
main.c
- в этом файле находится функцияmain()
, которая является точкой входа в программу. Она инициирует и контролирует выполнение всех других функций в программе.ext_type.h
- это заголовочный файл, который содержит объявления структур и массивов, используемых в программе. В данном случае, здесь объявлена структураsh
и массивshlist
.anotherfile.c
- этот файл содержит функциюmodify()
, которая изменяет значение поляx
структурыshlist[10]
.anotherfile.h
- этот файл содержит прототип функцииmodify()
. Прототип функции - это объявление функции, которое указывает тип возвращаемого значения функции и типы всех ее аргументов. Список файлов, которые используются в коде:main.c
ext_type.h
anotherfile.c
anotherfile.h