《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; }
例如
// 函数 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的命名规则去找.
=========================
- C-PRIMER PLUS读书笔记
- C-PRIMER PLUS读书笔记
- C++Primer读书笔记(一)
- C Primer Plus 读书笔记
- C++Primer读书笔记(二)
- 写写C++Primer读书笔记
- C primer 读书笔记1
- C++Primer读书笔记
- C++Primer读书笔记 Al
- C++primer读书笔记
- c primer读书笔记 第一章
- C++primer读书笔记5
- c primer读书笔记
- 《c++primer》 读书笔记
- c++primer读书笔记
- 《C++Primer》读书笔记(3)
- 《C++Primer》读书笔记(4)
- 《C++Primer》读书笔记(5)
- View的getDrawingCache为空,解决办法
- windows platformsdk 和 VS
- 互斥锁防止程序被多次打开
- 【如何打开win xp系统超级管理员权限_xitongshoucang.com】
- 利用SQL全局临时表防止登录
- 《C++ Primer》读书笔记(7.7)
- iOS开发icon图标设置
- c#正则表达式去行号
- xamarin.ios异步调用WCF
- 解决导入时候的科学计数
- OTL翻译(1) -- 说明
- SQL存储过程(包含事务/参数/嵌套调用/游标/循环)
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!
- 【XP中如何添加快速启动项】