关于将函数写入头文件问题

如果某些函数在其他很多 cpp 文件中被调用,那么为了避免写大量重复的代码以及让代码量更小一些,我们可以将这些函数写头文件中,然后其他 cpp 文件只需要引用该头文件然后就可以使用包含在头文件中的函数了。

具体实现方法:

可以直接将函数的定义写入一个xxx.h文件中
然后用g++ xxx.h 命令将xxx.h编译一遍
然后在cpp源文件中用#include"xxx.h"引用即可

然而上面的方法是存在问题的,如果直接将函数的定义写入头文件中,那么这个头文件如果只同时被一个 cpp 文件引用是可行的,但如果其同时被多个 cpp 文件引用是不行的。因为引用头文件在预编译时直接就将头文件中的内容插入源程序。如果直接将函数定义写在头文件中,然后该头文件被多个 cpp 文件引用,则这些 cpp 文件编译生成的 obj 文件中都含有写在头文件中的函数的定义,所以这些 obj 文件在链接的时候会由于含有重复定义而报错(c++ 中允许变量和函数的申明出现多次,但变量和函数的定义只能出现一次)。

例如:

 1 //gel.h
 2
 3 int max_(int a, int b){
 4     return a > b ? a : b;
 5 }
 6
 7 //test1.cpp
 8
 9 #include "gel.h"
10 #include <iostream>
11 using namespace std;
12
13 int main(void){
14     cout << max_(1, 2) << endl;
15     return 0;
16 }
17
18 //test2.cpp
19
20 #include <iostream>
21 #include "gel.h"
22 using namespace std;
23
24 int main(void){
25     cout << max_(10, 2) << endl;
26     return 0;
27 }

解决的方法:

在头文件中只写声明,把定义写到另一个cpp文件中就好啦。。

引用另一个文件的内容除了以头文件的形式外也可以直接将函数写入一个cpp文件,然后在需要引用的地方加个声明,再链接一下就好啦。。。

事实上只要符合语法(主要是不重复定义变量,函数等),也可以将一个 cpp 文件通过头文件引入另一个 cpp 文件中。。。

时间: 2024-11-08 03:52:49

关于将函数写入头文件问题的相关文章

linux socket网络编程 常用函数及头文件

转自:http://blog.chinaunix.net/u3/102500/showart_2065640.html 一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_DGRAM) 提供无连接的数据传输服务,不保证可靠性. 3.原始式套接字(SOCKET_RAW) 该接口允许对较低层次协议,如IP,ICMP直接访问. 二 基本套接字系统调有有如下一

各种函数的头文件

函数 头文件 sort() algorithm                                

函数放在头文件中被多次包含的重定义问题

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 例如一个头文件headfile.h这样写 #pragma once bool Func (){return true;} 在这个头文件被多个地方包含的时候就会出问题,链接时报错: (FuncB报重定义) "fatal error LNK1169: 找到一个或多个多重定义的符号" 原因是,在headfile.h中定义了函数及其实现,如果被包含时,则会把函数实现放入包含的位置,被包含

vc控制台程序中如何使用cstring类的函数,头文件怎么包含?

1.project->setting->general 里的Microsoft Foundmation class选择“Use MFC in a Shared DLL”,再包含<afx.h>就行了.2.直接include <afx.h>3.#include <atlstr.h>

【C++常用函数】头文件&lt;algorithm&gt;中的常用函数(绝对值,交换,比较)

swap(a,b) 用于交换a,b两个变量的值: max(a,b) 返回a,b中的最大值: min(a,b) 返回a,b中的最小值: abs(x) 返回x的绝对值,x必须是整数: 原文地址:https://www.cnblogs.com/sdtuzxr/p/11980107.html

C/C++函数重复定义、头文件重复包含、互相包含问题

1.避免头文件重复包含 // test.h 此段宏的意思是如果定义了宏变量TEST_H_则不再定义它 #ifndef TEST_H_ #define TEST_H_ //头文件内容 #endif 或者 // test.h 告诉预编译器只包含一次 #pragma once 2.避免重复定义 不要将函数定义放置在头文件里面,正确的做法是头文件放置函数声明,源文件放置函数定义.因为源文件是分别编译的,假如头文件放置了函数定义,包含该头文件的每一个源文件都会定义相应的函数,从而导致重复定义.但是几种情况

函数实现不放在头文件的原因,及何时可以放头文件的情况

1 .引子       在平常的 C/C++ 开发中,几乎所有的人都已经习惯了把类和函数分离放置,一个 .h 的头文件里放声明,对应的 .c 或者 .cpp 中放实现.从开始接触,到熟练使用,几乎已经形成了下意识的流程.尽管这样的做法无可厚非,而且在不少情况下是相对合理甚至必须的,但我还是要给大家介绍一下把实现全部放置到头文件中的方式,给出可供大家使用的另一个选择.同时针对这一做法,也顺便说一下其优缺点以及需要注意的情况.       我是一个很喜欢简洁的人,多年以来甚至养成了这样的癖好,如果一

C++内联函数、函数模板之于头文件

一.基本说明 C++标准中提到,一个编译单元是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE[PortableExecutable,即Windows可执行文件]文件格式,并且本身包含的就已经是二进制码,但是,不一定能够执行,因为并不保证其中一定有main函数.当编译器将一个工程里的所有.cpp文件以分离的方式编译完毕后,再由连接器(linker)进行连接成为一个.exe文件.

linux编程头文件所在路径的问题

一.问题引入 1.头文件与库 当我们在PC主机linux环境下(如ubuntu),编写linux应用程序,然后利用gcc来编译.在源代码的开始位置会写入头文件,那是因为我们使用了系统提供的库函数,例如printf.open.read.write等等.我们会写入类似的内容: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> ...... 我们的应用程序代码