C&C++(1) - extern "C"的作用
来源:互联网 发布:java是男人下 编辑:程序博客网 时间:2024/04/29 20:42
C++支持函数重载。例如,可以有多个函数拥有相同的函数名和不同的参数。C++编译器如何区分这些函数-依靠添加参数信息到函数名中。这个称为名称修饰。C++标准没有明确规定name mangling的具体规范,所以不同的编译器有不同的添加方法。
举例下面的函数 f()
int f (void) {return1; }int f (int) {return0; }void g (void) {inti = f(), j = f(0); }
C++编译器可能会将上面的名称修饰如下:
int __f_v (void) {return1; }int __f_i (int) {return0; }void __g_v (void) {inti = __f_v(), j = __f_i(0); }
使用C++编译时,如何处理C符号?
在C程序中,函数名称也许不会被修饰,因为C不支持重载。这样的话,在C++程序中使用C代码时如何保证名字不会被修改呢?参考下面的C++例子,它调用C函数printf().
//将文件保存为.cpp文件,并使用C++编译器进行编译int printf(constchar*format,...); int main(){ printf("hello world\n"); return 0;}输出:
undefined reference to `printf(char const*, ...)'
ld returned 1 exit status
ld returned 1 exit status
编译失败的原因很简单,printf的函数名称被C++编译器更改了,并且它没有找到修改后的对应函数.
解决方法是在C++代码中使用extern "C". 当一些代码被extern "C"覆盖时,C++编译器能保证其中的函数名字不会被修饰更改。
如果将上述代码改为下面所示,这个程序会正常工作并且打印出"hello world".
//将文件保存为.cpp文件,并使用C++编译器进行编译extern "C"{ int printf(const char*format,...);}int main(){ printf("hello world\n"); return 0;}
输出结果:
hello world
因此, 所有C风格的头文件(stdio.h, string.h等),都使用了extern "C"的来声明。
#ifdef __cplusplus
extern "C" {
#endif
//声明此头文件
#ifdef __cplusplus
}
#endif
extern "C" {
#endif
//声明此头文件
#ifdef __cplusplus
}
#endif
0 0
- C&C++(1) - extern "C"的作用
- extern "C" 的作用
- extern “C”的作用
- extern "C"的作用
- extern C 的作用
- extern "C"的作用
- extern c的作用
- extern c的作用
- extern "C" 的作用
- extern "c"的作用
- extern "C"的作用
- extern "C"的作用
- extern C的作用
- extern "C" 的作用
- extern c的作用
- extern "C"的作用
- extern "C"的作用
- extern "C"的作用
- 1^k+2^k+3^k+··· ZOJ 3547 UVA 766
- [[NSBundle mainBundle] infoDictionary]
- RPC学习了解
- [数学几何]取任意四边形最长边
- OC 中 Nil nil NULL NSNull 的区别
- C&C++(1) - extern "C"的作用
- IO--流--Stream
- leetcode 第74题 Search a 2D Matrix
- 科比都这么努力,你还有什么借口不努力呢?
- 第十一周 项目0 - 是春哥啊
- C++用%20替换字符串中的空格(O(n)的时间效率)
- chenglei1986/DatePicker源码解析(二)
- 设计模式-单例模式
- Convert Sorted Array to Binary Search Tree - LeetCode 108