Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 20

Разделение кода по файлам

29.12.2012, 20:11. Показов 1374. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, вопрос в следующем. В программе нужен глобальный (видимый из нескольких .с файлов) массив структур. Я его выношу в заголовок следующего вида:
C
1
2
3
4
5
6
7
8
9
10
11
12
/*ext_type.h*/
#ifndef EXT_TYPE_H
#define EXT_TYPE_H
 
struct sh
{
    char name[20];
    int x, y;
    //...
} shlist[56];
 
#endif
и подключаю затем в файлах, где производится обращение к shlist:
C
1
2
3
4
5
6
7
8
9
/*main.c*/
#include "ext_type.h"
 
void main()
{
    //...
    shlist[10].x = 0;
    //...
}
Как я понял, если таких файлов больше двух, то при сборке возникает multiple definition. Если же убрать #include в одном из файлов, будет обратное: "переменная не определена в текущей области видимости". Соответственно, вопрос: как правильно объявлять и использовать переменные при таком разделении?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2012, 20:11
Ответы с готовыми решениями:

Разделение кода на несколько файлов
Добрый день. Нужна помощь.В задании сказано, что нужно ввести данные с клавиатуры. Проблема в том, что функция написана, но в основной...

Разделение С кода на несколько файлов
Нужно разделить исходный код на 5 частей. #include <stdio.h> #define MAXVAL 100 int sp=0; char val; void push(char...

Разделение кода программы на файлы
Добрый вечер, Заранее извиняюсь, если это тема уже где-то подымалась на форуму. Тогда просто дайте линк, пожалуйста. Я давно...

11
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
29.12.2012, 21:16
ключевое слово extern
0
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 20
29.12.2012, 23:55  [ТС]
Extern показывает, что переменная была уже объявлена в другом файле, я правильно понимаю? Не помогло. Если я в .с-файлах пишу
C
1
extern sh shlist[12];
всё равно появляется multiple definition.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
30.12.2012, 06:54
Цитата Сообщение от Mieczeslaw Посмотреть сообщение
Если я в .с-файлах пишу
Внимательнее почитайте про extern
Как пример:
main.cpp
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include "osy.h"
int main()
{
    foo(45);
    printf("%d",MyGlobalVariable);
    return 0;
}
osy.h
C
1
2
3
4
5
#ifndef OSY_H
#define OSY_H
    extern int MyGlobalVariable;//Объявление переменной с внешней линковкой(external)
    void foo(int x);
 #endif
osy.cpp
C
1
2
3
4
5
6
7
#include "osy.h"
 
int MyGlobalVariable;//Определение переменной в одном из модулей
 
void foo(int x){
    MyGlobalVariable=x;
}
Название: Безымянный.jpg
Просмотров: 56

Размер: 8.1 Кб
0
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 20
31.12.2012, 01:08  [ТС]
Вроде бы врубился, спасибо. Вот так работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*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();
Возникает, правда ещё вопрос: подключать .с-файлы с внешними функциями через одноимённые заголовки (как отмечено знаками вопроса) - это обычная практика? Или тут вопрос общего размера программы?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.12.2012, 01:18
Ну если в заголовке прототипы функций, то все в порядке. Если же там реализация этих функций, то все файлы, которые включают данный заголовок будут вклчать реализацию и линковщик выдаст ошибку. Вы это имели ввиду?
0
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 20
31.12.2012, 01:53  [ТС]
Примерно. Про то, что линкер возмутится при таком включении, я уже понял. Я имею в виду, подключать файлы с внешними функциями правильно через заголовки с прототипами, так? То есть будут формироваться пары типа file.c (код функций) + file.h (прототипы функций), а в файле, откуда вызывается функция, вписывается #include "file.h"?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.12.2012, 02:08
Именно так. Прототипы скажут компилятору, что таке функции есть и их сигнатуру. А линковщик найдет их и проставит их "адреса".
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
31.12.2012, 04:12
Цитата Сообщение от Croessmah Посмотреть сообщение
ключевое слово extern
читай
https://www.cyberforum.ru/c/thread667991.html
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
31.12.2012, 04:17
Вопрос был о переменных, а не о функциях
0
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 20
31.12.2012, 16:11  [ТС]
Цитата Сообщение от alkagolik Посмотреть сообщение
Прочитал. В сущности, с переносом функций в отдельные файлы у меня получилось быстрее, чем с переменными. Спасибо всем ещё раз за помощь, с наступающим!
0
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 15:38
Цитата Сообщение от Mieczeslaw Посмотреть сообщение
Я имею в виду, подключать файлы с внешними функциями правильно через заголовки с прототипами, так? То есть будут формироваться пары типа file.c (код функций) + file.h (прототипы функций), а в файле, откуда вызывается функция, вписывается #include "file.h"?
Если хочется отделить интерфейс пользователя (программиста, использующего функции из .h- файла) от реализации, то лучше создать 2 h-файла и 1 cpp- файл. Это делает программу более "модульной". Хорошо об этом написано у Страуструпа в главе "Исходные файлы и программы".

Например, интерфейс может содержать одну функцию, а для реализации потребуется создать десяток переплетенных функций. В процессе кодирования значительно проще видеть одну функцию с параметрами, чем клубок чего-то непонятного.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.01.2013, 15:38
Помогаю со студенческими работами здесь

Разделение скрипта по файлам
Добрый день! Имеется большой скрипт, листингом ~10 страниц. Создается несколько объектов, каждый с DOM-элементами и объекты связаны...

Разделение шаблонного класса по файлам
Написал простой шаблонный класс на с++, но компилятор почему-то ругается, вот код: MyMath.h #ifndef MYMATH_H #define MYMATH_H ...

Разделение объявлений и определений по файлам
Добрый день, такой вопрос. В С++ в заголовочном файле мы указываем мы указываем объявление класса, ну там внутри прототипы функций,...

Разделение кода
Допустим у меня есть файл config.php и как его разделить на части, например прописываю путь /config.php/connect и файл будет обращаться...

Анализ небольшого кода по файлам
Помогите пожалуйста с кодом! Все вроде правильно и без синтаксических ошибок, но выдает &quot;Abnormal program termination&quot; при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru