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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ sort_array http://www.cyberforum.ru/cpp-beginners/thread241009.html
Всем форумчанам доброго времени суток!!Есть такая задача:реализовать меню,дающее пользователю выбрать сортировку массива по желанию(выбор,вставка или обмен) и направление(возрастание или...
C++ Решить уравнение с точностю Е и указать необходимое число итераций Нужно решить уравнение с точностю Е и указать необходимое число итераций. Ниже все даные, што у меня есть. Язык С, не С++. Буду очень благодарен если поможете. немного ошибся в формулє, в... http://www.cyberforum.ru/cpp-beginners/thread241007.html
C++ Определить, является ли введенная с клавиатуры строка вещественным числом
Написать программу, которая проверяет, является ли введенная с клавиатуры строка вещественным числом. Если является, то программа должна сообщить в какой форме записано данное число, в фиксированной...
C++ Квадратная матрица
//Дана квадратная матрица порядка n (n строк, n столбцов). //Найти наибольшее из значений элементов, расположенных в тёмно-синих частях матриц. //и вывести на экран его расположение в матрице....
C++ Debugging symbols Visual C++ 6 http://www.cyberforum.ru/cpp-beginners/thread240990.html
При отладке пишет Loaded 'ntdll.dll', no matching symbolic information foundи т. д. только с другими библиотеками. Отладочные символы скачал от сюда, 2008 студии показал папку с символами и почти...
C++ Буква или цифра? Как на с++ определить вводится буква или цифра? пробывал так : while(n<0 && n>9) cin>>n; подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru