Разделение кода по файлам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Разделение кода по файлам»

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();

Объяснение кода листинга программы

  1. main.c - в этом файле находится функция main(), которая является точкой входа в программу. Она инициирует и контролирует выполнение всех других функций в программе.
  2. ext_type.h - это заголовочный файл, который содержит объявления структур и массивов, используемых в программе. В данном случае, здесь объявлена структура sh и массив shlist.
  3. anotherfile.c - этот файл содержит функцию modify(), которая изменяет значение поля x структуры shlist[10].
  4. anotherfile.h - этот файл содержит прототип функции modify(). Прототип функции - это объявление функции, которое указывает тип возвращаемого значения функции и типы всех ее аргументов. Список файлов, которые используются в коде:
  5. main.c
  6. ext_type.h
  7. anotherfile.c
  8. anotherfile.h

Оцени полезность:

14   голосов , оценка 4.357 из 5
Похожие ответы