将函数实现放在头文件中

  研究一个开源算法库,采用C++模板编程,所有函数实现都放在了头文件中,现在把模板去掉,链接时发生冲突,具体原因如下:

  因为多个源文件包含了含有函数定义的头文件,在编译的时候,每个源文件都会包含一份函数定义,在链接时编译器不知道需要连接哪一份函数定义。

解决方法有三个:

1. inline关键字

  可以用关键字inline修饰函数定义,例如:

inline int add(int x, int y)
{
   return x + y;
}

使用inline关键字,编译器会在调用此函数的地方把函数的目标代码直接插入,像宏一样被就地展开了。

另外使用inline关键字会有两个缺点:代码的体积变大了;inline不算C语言的关键字,以后代码移植可能会出现问题。

2. static关键字

  可以用关键字static修饰函数定义,例如:

static int add(int x, int y){  return x + y;  }

使用static关键字,所有包含此头文件的源文件中都会存在此函数的一份副本,代码也有一定程度的膨胀,但好就好在互相不冲突,因为 static 关键字保证了该函数的可见度为单个源文件之内。

3. 通过类的成员函数实现

  实现方式如下:

#define Add(i,j)  Math_Add::add(i,j)

class Math_Add
{
public:
    static int add(int x, int y)
    {
       return x + y;
    }
}

在使用的时候,调用Add(i, j)即可实现。

以上是三种把函数实现放在头文件中的方法,但是最好还是不要这样做,还是将函数声明和实现分开比较好。

参考文章:http://blog.csdn.net/freeboy1015/article/details/8075849
时间: 2024-10-23 23:17:11

将函数实现放在头文件中的相关文章

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

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

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由Point派生出Circle类,再由Circle派生出Cylinder类.将类的定义部分分别作为3个头文件,对他们的成员函数的定义分别作为3个源文件 1.Point.h文件 1 #ifndef POINT_H 2 #define POINT_H 3 #include<iostream> //头文件也需要包含这个 4 using namespace std; 5

【转】模板类的声明与实现必须同时放在头文件中

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:余天升链接:http://www.zhihu.com/question/20630104/answer/15722407来源:知乎 模板类的实现,脱离具体的使用,是无法单独的编译的:把声明和实现分开的做法也是不可取的,必须把实现全部写在头文件里面.为了清晰,实现可以不写在class后面的花括号里面,可以写在class的外面. 解释: C++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,

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

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

C语言头文件中包含的函数

math.h常用函数 int  abs   (int x); double  acos  (double x); double  asin  (double x); double  atan  (double x); double  atan2 (double y, double x); double  atof  (const char *s); double  ceil  (double x); double  cos   (double x); double  cosh  (double

不要在头文件中写函数定义

我们都知道static声明静态函数在别的文件是不可以使用的,但是如果你将定义也写在.h文件下是不是还是这样的呢,或者说编译器会不会提示你这样是有问题的呢?结果却是将static函数的定义直接写在了file.h的头文件中,导致staic关键字失效,代码如下. //file1.h #include <iostream>using namespace std; static void fun() { cout << "static fun" << ends

OC高效率52:(二)类的头文件中尽量少引用其他头文件

// //  EOCPerson.h //  OC高效率52:类的头文件中尽量少引用其他头文件 // //  Created by Zoujie on 15/10/8. //  Copyright ? 2015年 Zoujie. All rights reserved. // #import <Foundation/Foundation.h> //#import "EOCEmployer.h" @class EOCEmployer;//向前申明该类,将引入头文件的时机尽量延

头文件中不可以放变量的定义

注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件 要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量, C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次. 不过有三个例外,一下三中实体的定义也可放到头文件中 1.值在编译时就已知的const 变量的定义可以放到头文件中 如:const int num(10); 2.类的定义可以放到头文件中 3.inline 函数 4.C++11的新特性 conste

浅谈c/c++头文件中#ifndef/#define/#endif的用法

想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码? 1. 其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include &q