extern "C" 有关问题
之前帮老板编译一个库的代码,遇到了一些问题,后来发现问题出现在extern "C"语法上。
1. C/C++语法extern 关键字
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。”----百度百科。值得注意的是extern int a,仅是一个声明, 可以在程序中出现多次,并没有分配存储空间,然而变量a作为全局变量,变量a的定义仅能出现一次。
// A.cpp
int i;
int main()
{
return ;
} // B.cpp
int i = 100;
编译A.cpp文件,B.cpp文件不会提示有错误,在编译阶段,各个文件中定义的全局变量相互是不透明的,编译A时觉察不到B中也定义了i,同样,编译B时觉察不到A中也定义了i。但是在链接阶段,A与B文件融合在一起,全部变量都存在程序的静态存储区域,因此会有如下报错:
但是,我们直接使用B.cpp中定义的变量,编译器并没有先见之明,在编译阶段无法知道变量定义在文件中,如下代码:
// A.cpp
//int i;
#include <iostream> using namespace std; int main()
{
cout<<i;
return ;
} // B.cpp
int i=;
将会提示:“错误 1 error C2065: “i”: 未声明的标识符 d:\程序\test\extern\a.cpp 9 1 extern”
为此,关键字"extern",便发挥了它的作用,在A.cpp文件中添加声明:extern int i;
// A.cpp
//int i;
extern int i;
#include <iostream> using namespace std; int main()
{
cout<<i;
return ;
} // B.cpp
int i=;
程序正常运行输出:100;
2. C++ extern "C" 语法缘由
3. 一般用法
经常在项目文件看到的extern “C”的用法:
#ifdef __cplusplus
extern "C" {
#endif // 代码 #ifdef __cplusplus
}
#endif
代码部分可以是:调用库函数头文件(ie. #include <c.h>、调用函数声明(ie. extern int add())、一段函数代码实现。需要注意宏__cplusplus,标志着编译器将会把代码按C还是C++语法来解释,目的是这个文件既可以被C调用也可以被C++调用。因为C并没有extern “C”语法,因此如果不加宏编译,编译器会报错的。
最新文章
- appium for hybrid app 处理webview
- Linux内核分析:dup、dup2的实现
- route命令
- Socket编程基础——无连接UDP
- PYTHON入门知识
- 如何在redhat下安装WineQQ
- [转]将Word转(保存)为带书签的PDF
- 【转】前端图片该保存为什么格式?png or jpg?
- SQL Server中时间段查询和数据类型转换
- 一个获取Android手机root权限的程序
- window对象的属性
- 03_Android项目中读写文本文件的代码
- W3bsafe]SQLmap过狗命令的利用+教程
- lemon special judge模板
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
- WebRTC网关服务器单端口方案实现
- css关于定位那些事情
- jquery 实现iframe 自适应高度
- 52 53django
- python并发编程之多进程理论部分
热门文章
- 键值对集合 dict(字典)
- DataUml Design 教程4-代码生成
- Java基础07 包(转载)
- Linux 常用文件管理命令
- [ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用 (转)
- PostgreSQL tips
- C++资源文件初使用[C++菜鸟]
- ASSERT(m_hWnd == hWndOrig) - 解决之
- MySQL没有远程连接权限设置
- 《从零开始学Swift》学习笔记(Day 3)——Swift 2.0之后增加的关键字