LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1514|回复: 4

一个C语言头文件实例问题

[复制链接]
发表于 2006-9-27 11:22:03 | 显示全部楼层 |阅读模式
/***********************************************************************************
*File:   examlib.h
*desc:  function declare and common define
************************************************************************************/
#ifndef _44BLIB_H_
     #define _44BLIB_H_
   
     #ifdef _eplusplus     /*这个条件编译中的语句是什么意思?*/
     extern "C" {         /*同时在结尾处也有一个这样的类似**/
     #endif              /*的条件编译,请看后面。         */

//紧接着的是一些常量定义:
    #define ONESEC0    (62500)
    #define ONESEC1    (31250)
    #define NULL  0
    #define EnterPWDN(clkcon)  ((xoid(*)(int))0xe0)(clkcon)
    .
    .
    .
//下面是一些函数原型的定义:
    void Delay(int time);
    void DelayMs(int ms_time);
    .
    .
    .
//下面这个就是跟开头一样的一个条件编译:
    #ifdef _cplusplus
    }
    #endif

#endif           /*_44BLIB_H_*/      

---------------------------------------------------------
---------------------------------------------------------
我是一个初学者,对上面头文件实例中的两个条件编译看不明白。
到底其中的--------extern "C"    和      }     ------------是什么意思?
还请帮帮忙!
谢谢了!
发表于 2006-9-27 11:48:52 | 显示全部楼层
#ifdef _eplusplus
这句是说:如果这个头文件用于C++的话,这段代码成为:
  1. extern "C" {
  2.     #define ONESEC0    (62500)
  3.     #define ONESEC1    (31250)
  4.     #define NULL  0
  5.     #define EnterPWDN(clkcon)  ((xoid(*)(int))0xe0)(clkcon)
  6.     .
  7.     .
  8.     .
  9.     void Delay(int time);
  10.     void DelayMs(int ms_time);
  11.     .
  12.     .
  13.     .
  14. }
复制代码

意思是说这些定义是用C的风格,而不是C++的风格。


如果不用
extern "C" {}
这个头文件用于C++时,编译可能会出错。
回复 支持 反对

使用道具 举报

发表于 2006-9-27 12:22:14 | 显示全部楼层
#ifdef _eplusplus /*这个条件编译中的语句是什么意思?*/
这句是错的,应该是
#ifdef __cplusplus /* 是c,而且最前面是两个下划线 */
C++和C的一个不同之处就是C++支持函数重载,但是为了和C兼容,C++使用和C相同的链接器。为此,C++编译器需要进行function name mangling,即C++的函数名实际上是你所定义的函数名加上一串用来区分重载函数的字符串。因此,C++编译器编译出来的函数无法用在C程序中,因为C编译器不进行function name mangling。extern "C"的作用就是取消function name mangling,使其中的函数能够同时用于C程序和C++程序。extern "C"一般用于C++程序。类似的还有extern "C++"(顾名思义,进行function name mangling),用于C程序。

请参考:
http://theory.uwinnipeg.ca/gnu/gcc/gxxint_15.html
回复 支持 反对

使用道具 举报

发表于 2006-9-27 13:16:39 | 显示全部楼层
编译估计没问题,链接出错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-27 21:35:06 | 显示全部楼层
这么说这两个条件编译是用在编译/链接时区别C和C++的.

谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表