C++我在所有的头中都使用了一个函数

C++ I have a function used in all my headers

本文关键字:函数 一个 C++      更新时间:2023-10-16

我的所有头文件和main.cpp都有一个相同的函数。如果我在main.cpp中定义它,它们在包含后都能使用吗?或者它们会有编译器问题吗?

这对整个头文件业务来说还是个新鲜事。提前谢谢。

在头文件(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();
}

C和C++中的头文件是一种语言工件。它们是这样一个事实的结果,即C和C++可以作为单程编译器来实现。相比之下,Pascal(例如)有一个两遍编译器,它在第一遍跳过未知实体,并在第二遍填充缺失的位。因此,在C和C++中,每个类型、对象和方法都必须声明为,然后才能使用。这是头文件的主要责任。

头文件将展开为包含它们的任何文件。换句话说:预处理器用文件"foo.h"的内容替换语句#include "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();
}

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

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

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文件以及新的头文件应该在同一路径中。

如果您有两个文件:

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中正常工作。如果你想了解更多,这篇文章的答案很好地总结了#ifndef

相关文章: