Понимание заголовочных файлов - PullRequest
1 голос
/ 17 апреля 2011

Сейчас я как-то запутался между файлами заголовков и функциями.

Может кто-нибудь рассказать мне о сценарии, в котором я мог бы использовать 4 файла заголовков с 4 различными вычислениями для функций?(Это могут быть простые; я только начал C ++ в прошлом семестре.) И профессор смутил меня, поэтому я надеялся на некоторую помощь здесь.

Я понимаю, что вы определяете функцию в файле заголовка.Но я не понимаю, как использовать файл заголовка в функции main().

Если кто-то показал пример, я уверен, что смог бы его понять.Он показал мне один с дополнением с int add(int x, int y), но я хочу знать функции, отличные от простого сложения.И как я могу поместить их в заголовочный файл, а затем использовать их в main().

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

Заголовочный файл полезен, когда вы хотите использовать класс в исходном файле (.cpp), отличный от того, в котором класс был реализован.

Для компиляции (создания объектных файлов .o)компиляторам c ++ требуется как минимум увидеть прототип функций, которые вы пытаетесь использовать;функции должны быть созданы каким-то образом, как любая функция, которую вы обычно используете.Компилятор хочет убедиться, что типы параметров и тип возвращаемого значения совпадают с тем, как функция используется в вашем коде.

Итак, вы можете поместить

int add(int x, int y);

в файле с именем "extension.h" и вашим определением

#include "addition.h"
int add(int x, int y)
{
    return x+y;
}

в файле с именем "extension.cpp".

В вашем основном файле вам просто нужно ..

#include "addition.h"

и вы можете использовать добавление (int, int) столько раз, сколько захотите, если вы не забудете скомпилировать дополнение.cpp с вашим main.cpp, способом, аналогичнымэто: (в этом примере используется G ++)

$ g++ -c addition.cpp;
$ g++ -c main.cpp;
$ g++ main.o addition.o -o BinaryOutput.out

Надеюсь, это поможет.

2 голосов
/ 17 апреля 2011

В C ++ вам нужно понимать разницу между объявлениями функций и определениями функций.

  • Объявление гласит: "функция с именем somename существует, и это ееinterface ".

    extern int somename(int x, int y);
    
  • Определение гласит" функция с именем somename существует, и именно так она реализована ".

    int somename(int x, int y)
    {
        return x + y + 1;
    }
    

Заголовок обычно используется для указания интерфейса, предоставляемого одним или несколькими классами, или интерфейса, предоставляемого одной или несколькими функциями.Он может предоставлять другую информацию, которую должны знать пользователи кода.Заголовок предназначен для использования более чем одним исходным файлом;нет особого смысла в том, чтобы иметь заголовок, предназначенный для использования одним исходным файлом (хотя в некоторых случаях это имеет смысл).

Таким образом, обычно заголовок предоставляет объявления функций.

Чтобы усложнить ситуацию, функции могут быть определены встроенными.Когда функция определена как встроенная, вы помещаете ее реализацию в файл (часто это файл заголовка), и компилятор может оптимизировать использование функции, чтобы избежать накладных расходов при вызове функции.Таким образом, вы можете создать заголовок, содержащий:

inline somename(int x, int y) { return x + y + 1; }

Без ключевого слова inline это приведет к нарушению правила ODR - One Definition Rule.В ODR говорится, что функция или глобально видимый объект могут быть определены в программе только один раз.Если ключевое слово inline было опущено в заголовке, но заголовок использовался больше, чем в файле, тогда каждый файл определял бы somename(), и файлы не могли быть связаны друг с другом, потому что было бы несколько определений somename().

2 голосов
/ 17 апреля 2011

Вы используете заголовочный файл, набрав #include "foo.h" в своем файле. Обычно объявления функций идут в заголовочных файлах, а определения помещаются в файлы cpp.

Например:

min.h

#ifndef MIN_H
#define MIN_H

int min( int a, int b );

#endif

min.cpp

#include "min.h"

int min( int a , int b ) {  
    // return a < b ? a : b; 
    // The following does the same as the commented out line
    if ( a < b )
        return a;
    else
        return b;
}

main.cpp

#include <stdio.h>
#include "min.h"

int main( void ) {  
    printf("min( 1 , 2) == %d\n", min(1,2));

    return 0;
}

В Linux вы должны скомпилировать что-то вроде следующего:

g++ main.cpp min.cpp -o minTest

, который даст вам исполняемый файл с именем minTest, который вы затем сможете выполнить, набрав ./minTest

...