我的所有头文件和main.cpp都有一个相同的函数,如果我在main.cpp中定义它们,一旦它们被包含在内它们是否能够使用它还是会有编译器问题?
这个整个头文件业务还是新手。提前谢谢。
答案 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.cpp
或main.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}}。