关于在头文件中实现函数的情况

原创 2013年12月04日 01:41:43
下面举个例子,这个例子只有3个文件

/* fun.h */
#ifndef FUN_H
#define FUN_H
void base(){};
void fun();
#endif 

/* fun.c */
#include "fun.h"
void fun()
{
    base();
}

/* main.c */
#include "fun.h"
int main()
{
    fun();
    return 0;
}

$gcc -c fun.c

$gcc -c main.c

$gcc -o main main.c fun.c

则会在链接是时候报重复定义base()的错误!

fun.o: In function `base':
fun.c:(.text+0x0): multiple definition of `base'
main.o:main.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit statu

注:开始时在对这行忽然很陌生,main.c中的fun(); 突然搞不清这行代码做了什么事了!fun的函数体是调用base()方法,虽然fun是在fun.c中实现的,但在main.c文件中用,

应该是调用main.c中的base()还是fun.c中的base()呢?其实,链接器自己都搞不清清楚了,所以报错了!


这里我突然想到一个问题:如在main中调用strlen(),但是编译的时侯,仅仅编译test.c,$gcc test.c即可!不需要编译strlen所在的.c文件吗?这个该怎么解释呢?

是不是这样的,这些标准函数已经编译成了动态链接库,程序编译后,直接链接就可以!但是,是通过什么样的方法找到对应的动态链接库文件呢?

对比自己写的函数API怎么才能像系统的strlen()一样呢?直接编译调用函数的那个文件?(待补充。欢迎赐教....)


对于上面的程序,如果这样编译

$gcc -c fun.c

$gcc -o main main.c

则报没有定义fun的错误;

/tmp/ccRYqwWl.o: In function `main':
main.c:(.text+0xc): undefined reference to `fun'        //未定义引用到‘fun’,因为fun.h中的fun();仅是声明!
collect2: error: ld returned 1 exit status,


---------------------------------------------------------------------------------------

为什么重定义呢?因为#include是预处理部分,在编译之前由预处理程序在这个部分复制头文件的内容过来。所以在编译时候,main.o和fun.o文件都有base()函数的定义。那么链接程序就不知道链接那个定义好了(二义性啊)

如何解决呢,为了实现“声明和实现分开”这个目标最好就是把这个base函数的函数体移到源文件里面。如果由于某种原因真的要放在头文件中...也可以。

static声明就可以了,静态函数的作用域是文件,而不是全局。比如,上面的例子将头文件里面的void base(){}改成static void base(){},那就OK。








C++头文件的编写--类在头文件中的写法

转载自:http://blog.csdn.net/lyanliu/article/details/2195632(标题:C++中头文件(.h)和源文件(.cpp)都应该写些什么) 头文件(.h)...
  • i577060715
  • i577060715
  • 2015年03月11日 15:08
  • 9261

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

1 、引子        在平常的 C/C++ 开发中,几乎所有的人都已经习惯了把类和函数分离放置,一个 .h 的头文件里放声明,对应的 .c 或者 .cpp 中放实现。从开始接触,到熟练使用,几乎...
  • freeboy1015
  • freeboy1015
  • 2012年10月16日 10:19
  • 2687

关于函数实现在头文件(.h)中造成的一个问题

问题描述: 在项目中遇到一个问题,把一个比较简短但是经常(包括其他文件中的使用)使用的函数放在头文件中实现,造成了一个链接错误。 // file1. h 预处理宏 #ifndef __F...
  • ghgui008
  • ghgui008
  • 2015年05月10日 15:23
  • 777

C++如何在.h头文件中直接定义函数

先声明,然后在一个辅助类中以友元方式写入函数定义。 只是一个无聊的研究结果。...
  • SineObama
  • SineObama
  • 2017年10月24日 22:56
  • 265

关于在头文件中定义函数的缺点

同一个函数、变量可以在不同的c文件中根据需要有多个声明,但只能有一个定义。这就决定了如果在头文件中定义函数或变量,则该头文件只能使用一次,不能被别的c文件使用,也即限制了最好只有一个c文件,因为别的c...
  • fushiqianxun
  • fushiqianxun
  • 2012年09月10日 00:03
  • 8135

(C语言)头文件实现的函数

在C语言里面,有时候为了方便(方便的同义词是偷懒),函数就直接在头文件里面实现了。那么这样子有什么问题呢?下面举个例子,这个例子只有3个文件/* fun.h */#ifndef FUN_H#defin...
  • jiangnanyouzi
  • jiangnanyouzi
  • 2008年11月15日 20:50
  • 7360

C++在头文件中编写实现代码的坏处

http://www.dewen.io/q/5951 1 在头文件中编写代码会导致同样的二进制被多个模块反复编译内联,导致程序体积上升 2 头文件中的代码会被很多的cpp文件引用,导致重复...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2015年09月28日 16:17
  • 1786

C语言程序设计函数头文件库

  • 2010年06月10日 17:54
  • 586KB
  • 下载

编程之美源代码,C++实现,能沟通过编译,各个函数写在分别的头文件件中。

  • 2011年01月24日 03:09
  • 4.44MB
  • 下载

为什么inline函数应该在头文件中定义?

inline函数(即内联函数)对编译器而言必须是可见的,以便能够在调用点展开该函数,与非inline函数不同的是,inline函数必须在调用该函数的每个文件中定义。当然,对于同一程序的不同文件,如果i...
  • Ronnie_Hu
  • Ronnie_Hu
  • 2017年03月15日 21:56
  • 1558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于在头文件中实现函数的情况
举报原因:
原因补充:

(最多只允许输入30个字)