《C++ Primer》读书笔记(7.7)

来源:互联网 发布:想做淘宝客服怎么找 编辑:程序博客网 时间:2024/04/30 12:35

链接指示符 extern "C" 

程序员用链接指示符[linkage directive] 告诉编译器 该函数是用其他的程序设计语言编写的

        // 单一语句形式的链接指示符         extern "C" void exit(int);         // 复合语句形式的链接指示符         extern "C" {               int printf( const char* ... );               int scanf( const char* ... );         }         // 复合语句形式的链接指示符         extern "C" {         #include <cmath>         } 

链接指示符不能出现在函数体中 下列代码段将会导致编译错误 
        int main()         {               // 错误 :链接指示符不能出现在函数内               extern "C" double sqrt( double );             double getValue();  //ok               double result = sqrt ( getValue() );               //...               return 0;          } 

    如果把链接指示符移到函数体外 程序编译将无错误 

        extern "C" double sqrt( double );         int main()          {               double getValue();  //ok               double result = sqrt ( getValue() );               //...               return 0;          } 


   如果我们希望C++函数能够为C 程序所用,又该怎么办呢?我们也可以使用extern "C" 链接指示符来使C++函数为C 程序可用

例如 

  // 函数 calc() 可以被 C程序调用         extern "C" double calc( double dparm ) { /* ... */ } 

============外链补充==============from http://blog.chinaunix.net/uid-24118190-id-2985318.html

用主程序的C调用C++的功能函数时总是提示该函数未定义(undefined)。这是什么问题?如何解决?

关键点在这里:我们就靠在C++的*.h和*.cpp的头尾加入下面代码才得以解决问题。

#ifdef __cplusplus 
extern "C" { 
#endif

//一段代码

#ifdef __cplusplus 
} 
#endif

 其中 __cplusplus是cpp中的自定义宏。上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.  加入 extern "C" 声明的目的是解决C与C++的相互调用的问题。

文件c.h:
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
文件c.c:
#include "c.h"
void C_fun()
{
}
------------------------------------
在文件cpp.cpp中调用文件c.c中的函数C_fun()
cpp.cpp的实现
#include "c.h"
int main()
{
     C_fun()
}
其中__cplusplus是C++编译器的保留宏定义.就是说C++编译器认为这个宏已经定义了.
所以关键是extern "C" {}   
extern "C"是告诉C++编译器件括号里的东东是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找.

=========================

      

原创粉丝点击