了解头文件

时间:2011-04-16 22:01:40

标签: c++ function header-files

我现在在头文件和函数之间有点混淆。

有人能告诉我一个场景,我可以使用4个头文件和4种不同的函数计算吗? (这可能是简单的;我上学期才开始使用C ++。)教授让我很困惑,所以我希望能在这里得到一些帮助。

我知道您在头文件中定义了一个函数。但我不明白如何在main()函数中使用头文件。

如果有人展示了一个例子,我相信我能理解它。他向我展示了int add(int x, int y)的另外一个,但我想知道除了简单添加之外的其他功能。如何将它们放在头文件中,然后在main()中使用它们。

3 个答案:

答案 0 :(得分:2)

您可以在文件中键入#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

来执行它

答案 1 :(得分:2)

如果要在源文件(.cpp)中使用与实现类不同的类,则头文件很有用。

要编译(创建.o对象文件),c ++编译器至少需要查看您尝试使用的函数的原型;函数需要以某种方式实例化,就像你通常使用的任何函数一样。编译器想要验证参数的类型和返回值的类型是否与代码中函数的使用方式一致。

所以,你可以把

int add(int x, int y);

在名为“addition.h”的文件和您的定义

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

在名为“addition.cpp”的文件中。

在你的主文件中,你只需要..

#include "addition.h"

你可以尽可能多地使用addition(int,int),只要你不要忘记用你的main.cpp编译addition.cpp,方式与此类似: (这个例子使用G ++)

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

我希望这会有所帮助。

答案 2 :(得分:2)

在C ++中,您需要了解函数声明和函数定义之间的区别。

  • 声明说“存在一个名为 somename 的函数,这就是它的界面”。

    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()