再论extern “C”:C代码调用C++代码
来源:互联网 发布:苹果安装软件 编辑:程序博客网 时间:2024/04/28 01:24
1. 编译器编译的基本单位是一个C文件或Cpp文件,并不对头文件进行编译。
2. extern “C”只能被C++编译器处理,C编译器并不认识这个标志。
还是使用上次分享的那篇文章中的示例代码,代码如下:
/*CppHeader.h*/#ifndef CPP_HEADER#define CPP_HEADERextern "C" void print(int i);#endif CPP_HEADER/*CppHeader.cpp*/#include "cppHeader.h"#include <stdio.h>#include <iostream.h>void print(int i){ printf("cppHeader %d\n",i);}/*c.c*/extern void print(int i);int main(int argc,char** argv){ print(3); return 0;}
还是有3个文件:CppHeader.h,CppHeader.cpp和c.c。使用下面的命令手工那个手工进行编译和链接:
cl /c /Tp CppHeader.cpp
cl /c /Tc c.c
link c.obj CppHeader.obj
会生成c.exe文件,而且运行正常。
现在,我们把CppHeader.cpp中的#include “cppHeader.h”去掉。再进行编译,还是同样的命令,就发现不会生成c.exe文件了。提示的错误为:
c.obj : error LNK2001: unresolved external symbol _print
c.exe : fatal error LNK1120: 1 unresolved externals
前后比较一下,我们发现只要在CppHeader.cpp文件中加入一句 extern “C” void print(int i) ,程序就能够正常编译链接了。extern “C” 告诉C++编译器,你把print()函数按照C的方式来编译吧。这样,C++编译器就把print(int i)这个函数编译为_print符号了,使用dumpbin工具可以看出来。
小小总结一些extern “C”的作用:
在某个C++源文件中,如果有extern “C”语句,那很可能有两种情况:
1.被extern “C”修饰的函数在本文件中实现,那么C++编译器就把这个函数按照C的方式来进行编译,本文件中别的函数调用此函数时按照C的方式来调用,或者说,按照C的方式链接。
2.被extern “C”修饰的函数在其它文件中实现,那么本文件中的函数调用此函数,就按照C的方式来调用,或者说,按照C的方式链接。
- 再论extern “C”:C++代码调用C代码
- 再论extern “C”:C代码调用C++代码
- extern "C"处理C代码
- c代码调用java代码
- matlab调用C代码
- C调用java代码
- C调用java代码
- java 调用C代码
- extern c , c++ 调用c
- extern "C" C 调用c++
- C++代码中extern "C"作用
- 在C#中调用C/C++代码
- c/c++/MFC 调用 js 函数代码
- c/c++/MFC 调用 js 函数代码
- c/c++/MFC 调用 js 函数代码
- PHP 调用C的代码
- C代码中调用Ruby
- Objective-C调用C++代码
- 冰点过期破解
- 解决Fedora 16字体发虚问题
- 如何改桌面路径
- Android:使用ActivityGroup来切换Activity和Layout
- 迷茫
- 再论extern “C”:C代码调用C++代码
- 文件操作函数fopen()使用笔记
- 我的makefile
- Android ListView Fast and Smooth Scroll 終極秘技
- eclipse 整合jdk、tomcat安装
- 桶排序
- LED知识(四)
- T-SQL 语句插入中文数据时数据库显示全是问号“???”的解决方法(数据库编码规则)
- 3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】