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

Правила объявления и определения структур в файлах

18.03.2023, 01:16. Показов 2518. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи! Подскажите, пожалуйста:
У меня есть заголовочный файл server.h, например, для объявления структуры.
Есть файлы server.cpp и user.cpp
в файле user.cpp содержится функция main
Вопрос: в каком файле правильнее определять структуры, в том, где ф-ция main или в server.cpp
По сути server.h и server.cpp созданы для структуры.

И следующий вопрос: грамотно ли разные структуры засовывать в 1 файл structure.h и structure.cpp, например. Или для каждой структуры правильнее создавать свой отдельный файл? Или как таковых норм нет?
Надеюсь вопросы корректные)

Где вообще можно посмотреть как правильно оформлять программу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2023, 01:16
Ответы с готовыми решениями:

Внешние глобальные переменные: определения и объявления в разных файлах
Доброго времени суток, уважаемые участники форума cyberforum.ru. Хотелось бы понять как работает пространство имен, исходя из...

Объявления и определения структур
Может кто-нибудь объяснить как это работает: //Source1.cpp #include "pch.h" #include <iostream> using namespace std; ...

Объявления и определения структур
Прошу объясните как это работает. //Source1.cpp #include "pch.h" #include <iostream> using namespace std; struct yZ { void...

10
 Аватар для rdksoft
24 / 24 / 6
Регистрация: 24.12.2008
Сообщений: 88
18.03.2023, 01:40
Доброй ночи! Определение структур следует размещать в заголовочных файлах (.h), которые подключаются к файлам, где используются данные структуры. В данном случае, структура объявлена в файле server.h, поэтому ее нужно определять именно в этом файле.

Относительно размещения структур в одном или разных файлах, то здесь нет жестких правил, и это зависит от конкретного случая. Однако, обычно, если структуры являются связанными (например, относятся к одному проекту), то их удобно объединять в один заголовочный файл (structure.h), а определения размещать в соответствующем файле с исходным кодом (structure.cpp). Если же структуры не связаны между собой, то их можно объявлять в разных заголовочных файлах.

Относительно оформления программы, хорошим тоном является соблюдение определенных правил стиля (codestyle) и правил написания кода. Например, можно использовать такие соглашения, как Google C++ Style Guide или LLVM Coding Standards
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
18.03.2023, 01:58
Цитата Сообщение от agent070 Посмотреть сообщение
У меня есть заголовочный файл server.h, например, для объявления структуры.
Что значит "для объявления"? Для объявления, не не для определения? То есть для объявления непрозрачной структуры - неполного типа?

Цитата Сообщение от agent070 Посмотреть сообщение
Вопрос: в каком файле правильнее определять структуры, в том, где ф-ция main или в server.cpp
По сути server.h и server.cpp созданы для структуры.
Если да, то, вестимо, определять непрозрачную структуру логично в server.cpp. Вы же сами сказали, что он "созданы для структуры".

О чем именно речь?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
18.03.2023, 02:07
Цитата Сообщение от agent070 Посмотреть сообщение
По сути server.h и server.cpp созданы для структуры.
Тогда структуру грамотно определять в файле server.h. Если бы речь была о классе, то его декларацию писать в MyClass.h файле, а определение (имплементацию) функций-членов класса - в MyClass.cpp (это если нет шаблонов, с использованием template все придется писать в каком-то одном файле).
Цитата Сообщение от agent070 Посмотреть сообщение
грамотно ли разные структуры засовывать в 1 файл structure.h и structure.cpp
Разбиение по файлам должно соответствовать какой-то логике проекта. Хорошая программа состоит из независимых модулей, каждый из которых реализовывает какой-то свой обособленный функционал. И вот эти модули и разносятся по соответствующим парам *.h + *.cpp файл. Это уже уровень архитектуры программы, и она должна быть хорошо продумана.
Небольшой пример. Пусть у нас есть приложение, которое должно принимать пакет данных, расшифровывать его, обрабатывать данные, шифровать и отправлять обратно. Хорошим разбиением на модули будет:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// @ если это прошивка для МК, то тут функции, специфичные для железа
// @ все функции, где есть работа с регистрами процессора, будут только в этих файлах
hdw_core.h
hdw_core.cpp
 
// @ занимается приемом и отправкой данных
// @ функции приема пакета, проверки валидности, формирования контрольных сумм и  т.д. будут только тут
// @ могут вызываться низкоуровневые фукнции передачи данных из модуля HDW_CORE, тогда нужно
//   подключить hdw_core.h в файле interface.h
interface.h
interface.cpp
 
// @ модуль шифрования
// @ шифровкой и дешифровкой занимается этот модуль
// @ для безопасности должны использоватья только переменные из этого модуля
//   время жизни значений с "ключами" должно быть минимальным
crypter.h
crypter.cpp
 
// @ главная функция тут
// @ какие-то вспомогательные структуры могут быть объявлены в main.h
// @ в main.h могут быть настройки проекта (#define OPTION_...)
main.h
main.cpp
Хорошо это разбиение тем, что каждый модуль по возможности обособлен, занимается своим делом и не имеет лишних зависимостей от других модулей. Соответственно, разбиение, нарушающее эти правила будет плохим. Примеров можно привести много, например грубой ошибкой было бы использование в файлах interface.h или interface.cpp каких-то обращений или определений, относящихся к регистрам процессора. В таком случае, если мы захотим переписать программу для запуска на другом процессоре, нам придется менять не только файлы hdw_core.h/hdw_core.cpp (что было бы просто и логично), но и искать в других модулях, где еще мы обращались к специфичным регистрам старого процессора.
Т.е. хорошо спроектированная программа относительно несложно отлаживается, тестируется и при необходимости модифицируется.
0
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257
18.03.2023, 02:26  [ТС]
Всем спасибо за ответы!
Я, наверное, не очень корректно выразился:
Попробую объяснить на примере:
Нужно создать библиотеку(книжную), у нас есть структура, в которой описываются свойства книги structure BOOK
Структура находится в файле book.h
Я хочу создать очередную книгу, мне BOOK book1 создавать в функции main(файл user.cpp), или в файле book.cpp?
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
18.03.2023, 02:55
Цитата Сообщение от agent070 Посмотреть сообщение
мне BOOK book1 создавать в функции main(файл user.cpp)
Да. А вообще, по-хорошему для main лучше сделать отдельный .cpp файл
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
18.03.2023, 08:33
Evgen173,
Тогда структуру грамотно определять в файле server.h. Если бы речь была о классе, то его декларацию писать в MyClass.h файле, а определение (имплементацию) функций-членов класса - в MyClass.cpp (это если нет шаблонов, с использованием template все придется писать в каком-то одном файле).
C++
1
2
3
4
class Some;//Объявление класса не являющееся определением
 
class Some {//Объявление класса являющееся определением
};
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
18.03.2023, 08:51
Цитата Сообщение от agent070 Посмотреть сообщение
Я хочу создать очередную книгу, мне BOOK book1 создавать в функции main(файл user.cpp), или в файле book.cpp?
Ничего не понятно.

Если вам нужно будет создавать "очередную книгу в библиотеке", то ни о статическом, ни об автоматическом объявлении BOOK book1 речи быть не может. Книги придется создавать в динамической памяти через new BOOK, чтобы их можно было создавать столько, сколько нужно, "на лету".
0
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
19.03.2023, 00:18
Croessmah, наверное я смешал термины. Речь шла о том, чтобы сделать определение (декларацию, и не forward declaration, а обычную) класса в *.h файле, а саму имплементацию (реализацию) функций этого класса - в *.cpp
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
19.03.2023, 08:19
Evgen173, Что является объявлением структуры, а что является определением?
1
И тут вот те нате
322 / 209 / 117
Регистрация: 12.07.2016
Сообщений: 555
19.03.2023, 08:30
Croessmah, благодарю, получается определение класса - в *.h файле, имплементация - в *.cpp (без template). Все верно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2023, 08:30
Помогаю со студенческими работами здесь

Правила объявления инициализации
Напишите основные - самые главные правила обьявления инициализации.

Странные объявления функций в заголовочных файлах
Пытаюсь потихоньку разобраться в C++. Когда читаешь теорию, почти все понятно, но когда лезешь в реальный код, возникает много вопросов. По...

Больше теории чем практики.правила объявления процедур в модулях
Каких правил нужно держаться при объявления процедур в модулях, то-есть как это сделать правильно, какие ключевые действия,команды и т.д. и...

Сложные определения и объявления
Решил создать отдельный топик т.к. ну совсем никак не могу разобраться (все взято с книги) есть вот такая штука void * ...

Отличие объявления, определения и инициализации
Здравствуйте, товарищи. Читаю тут книжицу по C++, учусь потихоньку. И возник у меня вопрос нерядового характера: в чём...


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

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