C ++我的所有标题都使用了一个函数

时间:2013-11-21 17:39:24

标签: c++ header

我的所有头文件和main.cpp都有一个相同的函数,如果我在main.cpp中定义它们,一旦它们被包含在内它们是否能够使用它还是会有编译器问题?

这个整个头文件业务还是新手。提前谢谢。

5 个答案:

答案 0 :(得分:5)

在头文件(myfunction.h)中,您只需要声明函数:

int foo(int param);

main.cpp(或任何其他cpp文件 - 更好的选择是myfunction.cpp - 只需确保定义包含在一个文件!)文件中,您需要定义函数:

int foo(int param)
{
   return 1;
}

在您使用函数foo的所有其他源(cpp)文件中,只需包含myfunction.h并使用函数:

#include "myfunction.h"

void someotherfunction()
{
    std::cout << foo(1) << std::endl;
}

编译器只需要在使用之前查看函数的声明。链接器将函数的定义与您使用该函数的位置连接起来。如果忘记在main.cpp文件中编写定义,则不会得到编译器,但会出现链接器错误。值得一提的是,编译器正在单独编译每个cpp文件,而链接器的工作是组合所有编译器目标文件并生成最终输出文件。在大多数设置中,链接器将在编译后自动调用,因此您可能不熟悉它。

如果在头文件中包含整个函数定义,那么将在包含头文件的每个转换单元中编译该定义,并且您将得到multiple symbol definition链接器错误或类似的东西 - 这就是您需要的原因仅包含头文件中的函数声明。但是,也有例外 - 例如,您可以声明您的函数inline - 其他答案解释了这种方法。

所以,现在myfunction.h包含函数声明:

#ifndef MY_FUNCTION_H
#define MY_FUNCITON_H

// declaration
int myfunction();

#end if

myfunction.cpp包含函数定义:

int myfunction()
{
    return 4;
}

现在,在file1.cpp和file2.cpp中你想使用这个函数,所以你要包括myfunction.h

// file1.cpp
#include "myfunction.h"

// somewhere in the file
void foo()
{
    std::cout << myfunction();
}

...并在第二个文件中:

// file2.cpp
#include "myfunction.h"

// somewhere in the file
void bar()
{
 /// ...
 std::cout << myfunction();
}

答案 1 :(得分:2)

C和C ++中的头文件是一种语言工件。它们是C和C ++可以作为单通道编译器实现的结果。相比之下,Pascal - 例如 - 有一个双程编译器,它在第一次传递期间跳过未知实体,并在第二次传递中填充缺失的位。因此,在C和C ++中,每个类型,对象和方法必须在之前声明才能使用它。这是头文件的主要职责。

头文件扩展到包含它们的任何文件中。换句话说:预处理器将语句#include "foo.h"替换为文件“foo.h”的内容。在这种情况下,您需要注意不要违反单一定义规则:实体不得多次定义。

要满足这两个要求,您有两个选择:使用inline关键字在标题中声明和定义函数,或仅在标题中声明它,并在另一个编译单元中定义它。

以下代码说明了两种解决方案:

// foo.h

inline void foo() {
    // Method is implemented in this header file.
    // It is marked 'inline' to prevent linker errors
    // concerning multiply defined symbols.
    ...
}

仅在标题中延迟,在另一个编译单元中实现:

// foo.h

extern void foo();


// foo.cpp (or another compilation unit)
void foo() {
    ...
}

无论您使用哪种解决方案,都可以使用任何编译单元中的foo()。如果你想从“main.cpp”使用它,代码看起来像这样:

// main.cpp
#include "foo.h"

int main() {
    foo();
}

答案 2 :(得分:0)

所以你有一个在所有头文件中使用的函数,为什么不创建一个实用程序h来跟踪这些类型的函数并内联函数.h?

答案 3 :(得分:0)

在自定义头文件中声明函数原型:

int add(int a, int b);

假设标题文件名为myfunction.h,并将其包含在您需要该函数的任何位置。

现在您可以在another.cppmain.cpp

上定义一项功能
int add(int a, int b){
   return a+b;
}

包含您的自定义标头文件:

#include "myfunction.h"

记住你的main.cpp和其他cpp文件,新的头文件应该在同一条路径中。

答案 4 :(得分:0)

如果您有两个文件:

main.cpp

#include "func.h"

int main(){

    hello();

    std::cout<<" world!\n";

    return 0;
}

&安培; func.h

#ifndef FUNC_H
#define FUNC_H

#include <iostream>

void hello(void){
    std::cout<<"hello";
}

#endif

iostreams对象和函数e.t.c可以在main.cpp中正常工作。 This posts如果您想了解更多信息,#ifndef的答案总结为{{1}}。