zoukankan      html  css  js  c++  java
  • 【转】#ifdef __cplusplus+extern "C"的用法

      时常看到别人的头文件中,有这样的代码:

     1 #ifdef __cplusplus
     2 
     3 extern "C" {
     4 
     5 #endif
     6 
     7 //一段代码
     8 
     9 #ifdef __cplusplus
    10 
    11 }
    12 
    13 #endif

      这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{,和 }处理其中的代码。

      要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的。使用extern "C"的目的就是实现C与C++之间的相互调用。

      如在C++中试图调用C语言编译的中间文件,则就需要使用上面的写法了。 

      具体的,可以这样做,在C语言下的头文件(c.h)中,加入上面提到的写法:

     1 #ifndef _c_h_
     2 #define _c_h_
     3 #ifdef __cplusplus
     4 extern "C" {
     5 #endif
     6 void C_fun();
     7 #ifdef __cplusplus
     8 }
     9 #endif
    10 #endif

    c.c的实现如下:

    1 #include "c.h"
    2 void C_fun()
    3 {
    4 }  

      则C++的源文件(cpp.cpp)可以调用C语言源文件c.c中的C_test():

    1 #include "c.h"
    2 int main()
    3 {
    4      C_fun()
    5 }

      其中__cplusplus是C++编译器的保留宏定义.就是说C++编译器认为这个宏已经定义了。

      所以关键是extern "C" {}

      extern "C"是告诉C++编译器:括号里的东东是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找。

      注:如果你的代码不知道是被C还是C++调用时,添加这段代码可以护你周全,因为如果是c++调用的话,extern "C'声明会有效。如果时c调用的话,那么,extern "C"声明无效!

      

      Q:那么啥时候会遇到需要使用这种写法呢?

      A:因为C语言起家早,常有这样的情况:一个库文件已经用C写好了而且运行良好,这个时候如果我们使用C++编写的程序需要链接这个库文件时,那么就要加上extern "C"来修饰了,不然链接时是找不到对应的函数的。

      Q:那么C中是如何调用C++文件中的函数呢?

      A:因为先有C后有C++, 所以只能从C++的代码中考虑了。不但要在c++头文件中用该宏和extern "C"括起,在cpp中也要这么做。原因就是让cpp编译器将那些代码,编译成c风格。如下:

    cpp.h的实现

     1 #ifndef _c_h_
     2 #define _c_h_
     3 #ifdef __cplusplus
     4 extern "C" {
     5 #endif
     6 void CPP_fun();
     7 #ifdef __cplusplus
     8 }
     9 #endif
    10 #endif

    cpp.cpp的实现

    1 extern "C" {    //告诉C+++编译器,扩号里按照C的命名规则编译
    2 void CPP_fun()
    3 {
    4      .....
    5 }

    总结

      C和C++对函数的处理方式是不同的。extern "C"是使C++能够调用C编写的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

    转自:http://blog.csdn.net/owldestiny/article/details/5772916

  • 相关阅读:
    oracle 10g 免安装客户端在windows下配置
    sql2005 sa密码
    使用windows live writer 有感
    windows xp SNMP安装包提取
    汉化groove2007
    迁移SQL server 2005 Reporting Services到SQL server 2008 Reporting Services全程截图操作指南
    foxmail 6在使用中的问题
    AGPM客户端连接不上服务器解决一例
    SpringSource Tool Suite add CloudFoundry service
    Java 之 SWing
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/7221761.html
Copyright © 2011-2022 走看看