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”语法,因此如果不加宏编译,编译器会报错的。
extern "C" 有关问题的更多相关文章
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- 16-static和extern关键字2-对变量的作用
上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...
- 15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
- 转:C++项目中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __c ...
- extern "c"用法解析
转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...
- extern
gcc编译器编译程序有四个阶段,预处理.编译.汇编.链接.预处理阶段会将源代码中的包含的头文件如stdio.h编译进来:编译阶段,gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的 ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- extern用法总结
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用".1. extern修饰变量的声明. 如果文件a.c需要引用b.c中变量 ...
- 链接(extern、static关键词\头文件\静态库\共享库)
原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...
随机推荐
- 李洪强漫谈iOS开发[C语言-001]-开发概述
- mockito模拟静态方法
这里要用到使用powerMock 注意点: 1 @RunWith(PowerMockRunner.class) 2 PowerMockito.mockStatic(StaticTest.class); ...
- Java bean 是个什么概念?
Java语言欠缺属性.事件.多重继承功能.所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码.Java Bean正是编写这套胶水代码的惯用模式或约定.这些约定包括getX ...
- 个人博客开发之 ueditor 安装
- python之斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数 这样的一个数列:0,1,1,2,3,8,13,21,34…….. 特别指出:0不是第一项,而是第零项. 在数学上被以 递归的方法定 ...
- oracle em手动配置
转载自:http://www.cnblogs.com/sopost/archive/2010/08/14/2190098.html 用emca配置em emca是一个命令提示符,使用格式和方法在命令提 ...
- 微信小程序 快键键
快捷键 格式调整 - Ctrl+S:保存文件 - Ctrl+[, Ctrl+]:代码行缩进 - Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块 - Ctrl+C Ctrl+V:复 ...
- asp.net中TextBox只能输入数字的最简洁的两种方法
如下TextBox <asp:textboxonkeypress="isnum()"id="TextBox1"runat="server&quo ...
- asp.net c#采集需要登录页面的实现原理及代码
当我们采集页面的时候,如果被采集的网站需要登录才能采集,原理搞清楚了,就好办了,我们所要做的仅仅是在采集的时候(或者说HttpWebRequest提交数据的时候),将Cookie信息放入Http请求头 ...
- C++11写算法之二分查找
同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的. 这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂.想试验两种算法,改变一下findFunc函数 ...