Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
10.02.2011, 23:44     Как правильно оформлять модули? #1
как правильно нужно оформлять модули?

допустим самый простейший.сохранил как 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();
}
так вот правильно или надо по-другому?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2011, 23:44     Как правильно оформлять модули?
Посмотрите здесь:

Как в С++ создавать модули (библиотеки)? C++
Как разбивать прогу на модули? C++
C++ Как правильно подключить модули?
Как правильно вызвать метод в С++ и как использовать команду goto в default C++
Как разделить программу на модули в Dec C++ C++
C++ Правильно связать модули
C++ Как правильно вписать функцию в h-файл и правильно её отразить в основной функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
10.02.2011, 23:52     Как правильно оформлять модули? #2
правильно
но только этот пример работать не будет, т.к. не подключено std;
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.02.2011, 23:57     Как правильно оформлять модули? #3
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();
}
Первый вариант предпочтительнее.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:09  [ТС]     Как правильно оформлять модули? #4
то есть предпочтительнее разбить на интерфейс и реализацию если файл .h или модуль в .cpp сохранять?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:11     Как правильно оформлять модули? #5
Цитата Сообщение от Artishok Посмотреть сообщение
то есть предпочтительнее разбить на интерфейс и реализацию?
Если я Вас правильно понял, то да.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:17  [ТС]     Как правильно оформлять модули? #6
а чем плох мой вариант?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:26     Как правильно оформлять модули? #7
Цитата Сообщение от Artishok Посмотреть сообщение
а чем плох мой вариант?
Заголовочные файлы предназначены для объявлений, а не реализации.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:40  [ТС]     Как правильно оформлять модули? #8
че-то у меня в первом варианте компилятор выдает
udefined reference to write(void)
silent_1991
11.02.2011, 00:43
  #9

Не по теме:

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

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

Не по теме:

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

silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.02.2011, 00:47     Как правильно оформлять модули? #11
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
А как же файлы *.hpp?

Никогда ими не пользовался))) А есть разница?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:49     Как правильно оформлять модули? #12
Конечно, они как раз и предназначены и для совмещения объявлений с реализациями.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 01:07  [ТС]     Как правильно оформлять модули? #13
то есть можно сохранять модули в .hpp?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 01:22     Как правильно оформлять модули? #14
Цитата Сообщение от Artishok Посмотреть сообщение
то есть можно сохранять модули в .hpp?
Можно. Но крайне желательно лишь в случае шаблонов.
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.02.2011, 10:39     Как правильно оформлять модули? #15
Заголовочные файлы - *.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 (которая говорит о том, что функция видна только в текущей единице трансляции).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2011, 20:59     Как правильно оформлять модули?
Еще ссылки по теме:

C++ Как правильно разделять программу на модули
C++ Как правильно оформлять заголовок main
Как оформлять функции в C++? C++
C++ Как разбить программу на отдельные модули в количестве 3 штук?
C++ Как правильно унаследовать TPoint2D от TPoint3D/ Правильно ли наследовать? ООП

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

Или воспользуйтесь поиском по форуму:
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
07.03.2011, 20:59  [ТС]     Как правильно оформлять модули? #16
а если в функции и модуля используется указатель на структуру то так и писать
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);
?
Yandex
Объявления
07.03.2011, 20:59     Как правильно оформлять модули?
Ответ Создать тему
Опции темы

Текущее время: 06:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru