如何在多个cpp文件中包含和使用函数?
// my_function.h
void func_i_want_to_include();
// my_function.cpp
void func_i_want_to_include()
{
puts("hello world");
}
//main.cpp
#include "my_function.h"
#include "file_b.h"
int main()
{
call_to_file_b();
func_i_want_to_include();
return 0;
}
//file_b.h
void call_to_file_b();
//file_b.cpp
#include "my_function.h"
void call_to_file_b()
{
puts("from file b\n");
func_i_want_to_include();
}
当我这样做的时候,我会通过链接器得到收益"解析外部符号" ,我猜连接器超过func_i_want_to_include()
2次而不是理解这是相同的功能。
我如何告诉他'这个功能只是从2个文件中调用它,但是不要尝试制作2个相同功能的副本吗?
答案 0 :(得分:2)
首先,正如@LuisGP所提到的,如果您的头文件包含多次,则需要#ifndef。其次,在关联的cpp文件中,您需要包含头文件。头文件声明了该函数,cpp文件描述了该函数。最后,编译时必须包含所有cpp文件(如果编辑器不工作,只需使用命令行)。它是这样的:
gcc -c my_function.cpp file_b.cpp //this will make a my_function.o and a file_b.o file
gcc -o main main.cpp my_function.o file_b.o
或简称:
gcc -o main main.cpp my_function.cpp file_b.cpp
以下是如何编写文件:
// my_function.h
#ifndef _my_function_h
#define _my_function_h
void func_i_want_to_include();
#endif
// my_function.cpp
#include <stdio.h>
#include "my_function.h"
void func_i_want_to_include()
{
puts("hello world");
}
//file_b.h
#ifndef _file_b_h
#define _file_b_h
void call_to_file_b();
#endif
//file_b.cpp
#include <stdio.h>
#include "my_function.h"
#include "file_b.h"
void call_to_file_b()
{
puts("from file b\n");
func_i_want_to_include();
}
//main.cpp
#include "my_function.h"
#include "file_b.h"
int main()
{
call_to_file_b();
func_i_want_to_include();
return 0;
}
这是我第一次回答问题,如果我犯了任何错误,请告诉我,我会解决它。希望它有所帮助。
答案 1 :(得分:1)
如果要将函数定义放在头文件中,则需要使函数内联。
// my_function.h
inline void func_i_want_to_include()
{
puts("hello world");
}
否则,编译器将为包含头文件的每个cpp文件创建一个函数,链接器将不知道选择哪个。
这就是你通常将函数声明分开的原因
void func_i_want_to_include();
来自功能定义
void func_i_want_to_include()
{
puts("hello world");
}
前者进入头文件,而后者进入源文件。
答案 2 :(得分:0)
正如eozd所说,头文件用于声明。但是你的问题是你的头文件被多次包含,每个#include子句一个。 您可以解决添加
的问题#pragma once
在标题的顶部或旧时尚方式:
#ifndef _MY_HEADER_FILE_H_
#define _MY_HEADER_FILE_H_
// Stuff
#endif // _MY_HEADER_FILE_H_
答案 3 :(得分:-1)
您必须创建一个头文件。在该文件中创建一个对象并在类中实现一个公共函数。