Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767

Как правильно оформлять модули?

10.02.2011, 23:44. Показов 6060. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как правильно нужно оформлять модули?

допустим самый простейший.сохранил как modul.h
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
extern void write();
 
void write()
{
    cout<<"Hello world!"<<endl;
    return;
}
основная прога
C++
1
2
3
4
5
6
7
#include <iostream>
#include "modul.h"
 
void main()
{
    write();
}
так вот правильно или надо по-другому?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2011, 23:44
Ответы с готовыми решениями:

Как правильно оформлять заголовок main
Добрый день всем. Читая книги, копаюсь в чужих кодах нахожу разное оформление функции main. Например в Керниган и Ритчи по Си, автор иногда...

Как правильно подключить модули?
Задача: Даны натуральное число n, действительные числа x1,y1; x2,y2;... xn,yn;. Найти площадь n-угольника, вершины которого при некотором...

Как правильно разделять программу на модули
Как же всё-таки правильно разделять программу на модули? В интернете нашел 2 способa Но всё равно ошибки при компиляции...

15
программист С++
 Аватар для sandye51
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
10.02.2011, 23:52
правильно
но только этот пример работать не будет, т.к. не подключено std;
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
10.02.2011, 23:57
sandye51, неа.
Либо:
C++
1
2
// module.h
void write();
C++
1
2
3
4
5
6
7
// module.cpp
#include "module.h" // Не уверен, что необходимо
#include <iostream>
 
void write() {
  std::cout << "Hello world!" << std::endl;
}
C++
1
2
3
4
5
6
// main.cpp
#include "module.h"
 
void main() {
  write();
}
Либо:
C++
1
2
3
4
5
6
// module.cpp
#include <iostream>
 
void write() {
  std::cout << "Hello world!" << std::endl;
}
C++
1
2
3
4
5
6
// main.cpp
extern void write();
 
void main() {
  write();
}
Первый вариант предпочтительнее.
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:09  [ТС]
то есть предпочтительнее разбить на интерфейс и реализацию если файл .h или модуль в .cpp сохранять?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:11
Цитата Сообщение от Artishok Посмотреть сообщение
то есть предпочтительнее разбить на интерфейс и реализацию?
Если я Вас правильно понял, то да.
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:17  [ТС]
а чем плох мой вариант?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:26
Цитата Сообщение от Artishok Посмотреть сообщение
а чем плох мой вариант?
Заголовочные файлы предназначены для объявлений, а не реализации.
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:40  [ТС]
че-то у меня в первом варианте компилятор выдает
udefined reference to write(void)
0
11.02.2011, 00:43

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Заголовочные файлы предназначены для объявлений, а не реализации.
А как же шаблонные классы? ;)

0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:46
Цитата Сообщение от Artishok Посмотреть сообщение
че-то у меня в первом варианте компилятор выдает
Какой компилятор? Проверил на MSVS - полет нормальный.

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
А как же шаблонные классы?
Ну дак есть же *.hpp :p

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.02.2011, 00:47
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А как же файлы *.hpp?

Никогда ими не пользовался))) А есть разница?
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:49
Конечно, они как раз и предназначены и для совмещения объявлений с реализациями.
2
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 01:07  [ТС]
то есть можно сохранять модули в .hpp?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 01:22
Цитата Сообщение от Artishok Посмотреть сообщение
то есть можно сохранять модули в .hpp?
Можно. Но крайне желательно лишь в случае шаблонов.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.02.2011, 10:39
Заголовочные файлы - *.h (или *.H, *.hpp) - предназначены для определения интерфейса модуля. Он содержит объявления функций, констант, типов данных, которые будет предоставлять модуль.
Без них, в общем-то, можно было бы и обойтись. Допустим, у нас есть некоторый файл foo.c, который предоставляет фукцию magnitude для определения длины вектора:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <math.h>
 
struct vector
{
    double x, y;
};
 
double sumOfSquares(double x, double y)
{
    return x * x + y * y;
}
 
double magnitude(struct vector vector)
{
    return sqrt(sumOfSquares(vector.x, vector.y));
}
Мы не сможем просто так использовать эту функцию в файле main.c, который будет содержать главную функцию, т.к. при компиляции этого файла компилятор ничего не знает о функции magnitude и о структуре vector. Поэтому нам нужно явно поместить объявление функции magnitude и структуры vector в файл main.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
struct vector
{
    double x, y;
};
 
double magnitude(struct vector);
 
int main()
{
    struct vector v = {15.5, -8.9};
    printf("Vector v = {%.2f, %.2f}, |v| = %.2f\n", v.x, v.y, magnitude(v));
        
    exit(0);
}
Такая программа скомпилируется и заработает. Но этот способ неудобен и подвержен ошибкам.
Поэтому мы создадим файл foo.h и поместим в него объявления magnitude и vector. Окончательная версия программы выглядит так:
foo.h:
C
1
2
3
4
5
6
7
8
9
10
11
#ifndef FOO_H
#define FOO_H
 
struct vector
{
    double x, y;
};
 
double magnitude(struct vector);
 
#endif
foo.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <math.h>
 
#include "foo.h"
 
static double sumOfSquares(double x, double y)
{
    return x * x + y * y;
}
 
double magnitude(struct vector vector)
{
    return sqrt(sumOfSquares(vector.x, vector.y));
}
main.c:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
#include "foo.h"
 
int main()
{
    struct vector v = {15.5, -8.9};
    printf("Vector v = {%.2f, %.2f}, |v| = %.2f\n", v.x, v.y, magnitude(v));
        
    exit(0);
}
Если вспомнить, как работает директива #include, то станет понятно, что после работы препроцессора содержимое файла foo.h будет находиться в начале файлов main.c и foo.c, что практически соответствует первоначальному варианту. Связка директив препроцессора #ifndef-#define-#endif в foo.h нужна для предотвращения ошибок компиляции, которые могут возникнуть при повторном включении заголовочного файла (вместо нее можно было бы использовать директиву #pragma once, но она поддерживается не всеми компиляторами). Так же стоит отметить, что мы не собираемся "экспортировать" функцию sumOfSquares, т.к. она является вспомогательной для функции magnitude. Поэтому мы не поместили ее объявление в заголовочный файл и определили ее с спецификатором static (которая говорит о том, что функция видна только в текущей единице трансляции).
1
ЧакЭ одобряЭ
 Аватар для Artishok
285 / 284 / 86
Регистрация: 27.12.2009
Сообщений: 1,767
07.03.2011, 20:59  [ТС]
а если в функции и модуля используется указатель на структуру то так и писать
C
1
2
3
4
5
6
void destroy(struct bilet *bilet,int cnt)
{
   if (bilet) free(bilet);
   bilet = NULL;
   cnt=0;
}
и объявлять так
C
1
void destroy(struct bilet,int);
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.03.2011, 20:59
Помогаю со студенческими работами здесь

Как правильно разбивать класс на модули?
Как правильно разбить на модули абстрактный класс и класс наследник? Допустим, у меня есть какой-то абстрактный класс двигателя class...

Как оформлять функции в C++?
Ребят, только начал изучать с++, как лучше писать: Сначала прототип функции над main а потом самую функцию под мейном, или же сразу всю...

Правильно связать модули
//main.cpp #include &lt;iostream&gt; #include &quot;header.hpp&quot; using namespace std; int main() { f(); system(&quot;pause&quot;); ...

Как правильно оформлять URL
Доброго времени! Где-то тут читал тему про допустимые символы, но сейчас никак не найду, так что сильно не пинайте :\&quot;&gt; ...

Как правильно оформлять подарки от поставщика?
Всем доброго времени суток! Подскажите, пожалуйста, как правильно оформлять подарки (бонусы) от поставщика? Т.е. от поставщика приходит...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru