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

原创 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。








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

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

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

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

头文件中写类的实现出现函数重复定义的问题

先来做一个实验,你在一个头文件中定义一个类,然后把内中的一个函数的实现写在这个头文件当中。 //A_test.h #ifndefine _A_TEST_ #define _A_TEST_ ...

函数声明放在头文件中,函数的定义放在实现文件中,然后在主函数中调用

1.文件的组织结构如下图: 2.Menu.h内容如下:       #ifndef  MENU_H    #define MENU_H    int add(int a,int b);...

提醒初学者注意 send(sendto) recv(recvfrom) 中的 参数flags

/*说明:    1 这篇文章是给象我一样的初学者看的,如果您有一些经验了,请不要看,因为它会花费您宝贵的时间。     2 使用 MSDN 版本:MSDN Library - October 200...

多个C程序如何访问(共享)同一变量(数据)?

用C语言编写程序的时候,我们经常会遇到这样一种情况:多个C文件共享(访问)同一个变量或一个C文件模块功能很多需要拆分成几个不同功能模块的点C文件,如很让原本在一个C文件中共享的数据在拆分后的不同点C文...

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

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

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

原文 : http://hi.baidu.com/pope123/item/f2eb0b2fb6a2110e73863e71 1 、引子 这篇文章的题目念起来比较怪,...

头文件和源文件在不同目录情况下 Makefile自动推导依赖关系的实现

参考 跟我一起写Makefile http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225&extra=&authorid=106107...
  • shun01
  • shun01
  • 2014年04月04日 16:40
  • 2043

c++ 头文件<cstring>(或者string.h)中的常见函数的实现!

c++ 头文件(或者string.h)中的常见函数的实现!
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于在头文件中实现函数的情况
举报原因:
原因补充:

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