C++我在所有的头中都使用了一个函数
C++ I have a function used in all my headers
我的所有头文件和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.cpp
或main.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
。
- 函数向量_指针有不同的原型,我可以构建一个吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何仅为一个函数添加延迟
- 构造函数正在调用一个使用当前类类型的函数
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 在c++中的复制构造函数/一个声明语句中的初始化的延续中使用chain方法
- C :基类调用自己的虚拟函数 - 一个反图案
- 如何在这个交换函数(一个单独的链表)中找到错误
- 两个相同的函数(一个使用模板模式,另一个不使用)
- 你怎么能一次给一个函数一个参数呢
- 为什么要做两个函数?(一个是非const,另一个是const)
- 当代码在其他地方使用时,如何保证函数一个接一个地被调用