博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#if defined(__cplusplus)
阅读量:5317 次
发布时间:2019-06-14

本文共 948 字,大约阅读时间需要 3 分钟。

由于C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的。这就使得C和C++的互相调用变得很常见。但是有时可能又会直接用C来调用,不想重新写代码,让标准C编写的dll函数定义在C和C++编译器下都能编译通过,通常会使用以下的格式:(这个格式在很多成熟的代码中很常见)

#if defined(__cplusplus)//只有c++编译器才有这个宏定义。
extern "C" {
#endif
// 在这里写标准C程序,例如dll导出函数的定义
#ifdef __cplusplus
     }
#endif

下面解释一下上面的代码:

      首先__cplusplus是C++编译器内部定义的宏,如果使用的C编译器,__cplusplus宏不会被定义。它可以作为区分使用的是C编译器还是C++编译器的标志。在标准C中C代码直接写就可以了。而在C++中,需要加extern "C"或包含在extern "C"块中。

由于标准C是不支持extern "C"的,会产生变异错误,所以使用预编译指令通过__cplusplus来判断只有在使用C++编译器的时候才定义extern "C"。

意思是说,如果是C++程序,就使用
extern "C"{


而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的

extern "c" 函数描述 指定它为C函数

extern "C"表示编译生成的内部符号名使用C约定

 C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。下面以例子说明,如何 在C++中使用C的函数,

 

转载于:https://www.cnblogs.com/azbane/p/8522625.html

你可能感兴趣的文章
2018/2/20 Springretry,Feign,以及用通俗的语言(自认为)教会你关于Hystrix的复杂概念...
查看>>
数据结构实验8
查看>>
字体精讲
查看>>
SPSS-SPSS Modeler
查看>>
自己项目使用了ARC,项目中使用第三方库继续引用ARC
查看>>
Xshell评估过期处理方法
查看>>
Node.js Mongoose数据库连接失败 提示:Authentication failed
查看>>
二分搜索
查看>>
Vue购物车项目
查看>>
jdbc 3.0
查看>>
java 流读写文件
查看>>
elk 数据存储
查看>>
api 跳转规则
查看>>
PHP计算多少秒/分/时/天/周/月/年之前 : timeago
查看>>
B-Boxes
查看>>
Cannot access org.springframework.context.ConfigurableApplicationContext
查看>>
二分图最大匹配
查看>>
为什么抽象类不能实例化却有构造方法
查看>>
UESTC 电子科大专题训练 DP-D
查看>>
活代码LINQ——06
查看>>