Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Что же такое .h и .cpp?


Автор: GKosh 24.1.2006, 21:06
Пробовал искать по форуму, вероятно плохо искал.

Итак, мне наконец-то хотелось бы четко представлять себе как именно компонуется исполняемый код.

Допустим у меня есть три файла 1.cpp, 2.h и 2.cpp:

//1.cpp:
#include "2.h"
void main() { do_something() ; }

//2.h:
void do_something();

//2.cpp:
#include "2.h"
void do_something() { }

Как будет выглядить гипотетический скомпонованный файл? Наверное не так:

void do_something();
void main() { do_something() ; }
void do_something() { }

Тогда как?
По какому вообще принципу использовать #include в проекте с большим числом файлов, один супер .h-файл хоть и работает но не слишком-то практичен, когда же действуешь по принципу "Каждому .cpp необходимые ему .h" получаешь настоящий ворох ошибок линковщика. Вообщем никакой ясности относительно компоновки исходных файлов в бедной моей голове нет, хотя уверен все это должно быть несложно.

Автор: sergejzr 24.1.2006, 21:34
Представь себе это так:
каждое обьявление обьекта (функции, класса, или переменной) заменяется компилятором на число. Число это - адрес обьекта в памяти. Естественно обьявление должно произойти ДО использования обьекта. Если .h два раза инклюдится в проект, то естественно, что также вылетает ошибка, потому что число обьекту уже присвоено и тут присваивается ещё раз.

Для этого делается:
Код

#ifndef NAME_OF_THIS_H
#define NAME_OF_THIS_H
//Здесь само содержимое файла

#endif 


В этом случае компилер первый раз пропарсит файл, а по второму разу "перепрыгнет".

Автор: GKosh 25.1.2006, 07:46
О! Спасибо большое, а я то гадал зачем эти #ifndef? Теперь все стало на свои места.

Автор: KyKy 25.1.2006, 13:08
Дам простенький примерчик на сложение двух чисел с .h и .cpp
Код

// PR_ALL.H
// Включаемый файл для всех файлов проекта PR_ALL.
// Главная функция проекта находится в файле pr_all.cpp

#ifndef PR_ALL_H
#define PR_ALL_H

    #include <stdio.h>

    // Прототипы функций
    int sum( int a, int b );

#endif



Код

// PR_ALL.CPP
/* Программа вычисляющая y = a + b
    Файл проекта - pr_all :    pr_all.cpp    - main()
                            sum.cpp        - sum()
    Включаемые файлы:        pr_all.h
*/

#include "pr_all.h"

int main( void )
{
    int a = 1,                // Исходные данные
        b = 2,
        y;                    // Результат

    // Вычисление суммы
    y = sum( a, b );

    // Печать
    printf( "Программа вычисляющая y = a + b \n\n Исходные данные: \n"
        "a = %d        b = %d \n\n Результат: \n y = %d \n\n", a, b, y );

    return 0;
}


Код

// SUM.CPP
/* Файл из проекта pr_all
/ Главная функция проекта находится в файле pr_all.cpp
*/

#include "pr_all.h"

// Функция вычисляющая сумму двух целых чисел
int sum(                    // Сумма
    int a,                    // Первое слагаемое
    int b )                    // Второе слагаемое
{
    int s;                    // Сумма

    s = a + b;

    return s;
}





Такой вот примем даёт неплохое представление как всё делать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)