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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
#1

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

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

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

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

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

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

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

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

Как в С++ создавать модули (библиотеки)? - C++
Подскажите как в С++ создавать модули(библиотеки)? Чем проще тем лучше)) Заранее спасибо.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
10.02.2011, 23:52     Как правильно оформлять модули? #2
правильно
но только этот пример работать не будет, т.к. не подключено std;
CyBOSSeR
Эксперт C++
2300 / 1670 / 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
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:09  [ТС]     Как правильно оформлять модули? #4
то есть предпочтительнее разбить на интерфейс и реализацию если файл .h или модуль в .cpp сохранять?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:11     Как правильно оформлять модули? #5
Цитата Сообщение от Artishok Посмотреть сообщение
то есть предпочтительнее разбить на интерфейс и реализацию?
Если я Вас правильно понял, то да.
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 00:17  [ТС]     Как правильно оформлять модули? #6
а чем плох мой вариант?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:26     Как правильно оформлять модули? #7
Цитата Сообщение от 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++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:46     Как правильно оформлять модули? #10
Цитата Сообщение от Artishok Посмотреть сообщение
че-то у меня в первом варианте компилятор выдает
Какой компилятор? Проверил на MSVS - полет нормальный.

Не по теме:

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

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

Никогда ими не пользовался))) А есть разница?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 00:49     Как правильно оформлять модули? #12
Конечно, они как раз и предназначены и для совмещения объявлений с реализациями.
Artishok
ЧакЭ одобряЭ
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
11.02.2011, 01:07  [ТС]     Как правильно оформлять модули? #13
то есть можно сохранять модули в .hpp?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.02.2011, 01:22     Как правильно оформлять модули? #14
Цитата Сообщение от Artishok Посмотреть сообщение
то есть можно сохранять модули в .hpp?
Можно. Но крайне желательно лишь в случае шаблонов.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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     Как правильно оформлять модули?
Еще ссылки по теме:

Как разделить программу на модули в Dec C++ - C++
Как происходит деление на модули в С++? вот например в Delphi я создавал новый unit и в обоих файлах прописывал доступ к друг другу через...

Как разбить программу на отдельные модули в количестве 3 штук? - C++
#include &lt;iostream&gt; using namespace std; int main() { int n; int i = 0; int s = 0; int z; cout &lt;&lt; &quot;Entered number...

Как правильно записать алгоритм и как отобразить max и min? - C++
как правильно записать алгоритм и как отобразить max и min h = min {a,b,max{c,d}}

C++ как правильно передавать функцию как параметр? - C++
Всем првет! Я кодю на OpenGL и сделал клас Game у меня в етом класе есть функция DrawGLScene(); как мне передать ее в ...

Прошу сказать, правильно ли я решил, и , если не правильно, то указать ошибки - C++
Есть задачка \sum_{i=0}^{8}\sum_{j=0}^{10}\sum_{k=0}^{3}\left(\frac{i+3k-4j}{2+3i+4j} \right) и есть мой код (сразу говорю, я...


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

Или воспользуйтесь поиском по форуму:
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     Как правильно оформлять модули?
Ответ Создать тему
Опции темы

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