一、概述

以C语言编写的源文件后缀名为.c,以C++语言编写的源文件后缀名为.cpp,C++支持函数的重载,C和C++编译器对函数的编译处理是不完全相同。C++编译后的函数一般是以函数名和形参类型来命名,C则是直接利用函数名进行命名。

假设有函数void MyFunc(int, int, int),则在C++编译后的函数名为_MyFunc_int_int_int,用函数名和参数类型来命名编译后的函数名;而C编译后的函数可能会是_MyFunc,因此C不支持重构。

那么如果需要在C++程序中使用C代码,如何操作呢,这涉及到混合编程。首先看一下extern与static。

二、extern 与 static

extern用于在C和C++语言中声明某变量或者函数的作用域是全局,告诉编译器其声明的函数和变量可以在本文件或其他文件中调用。在头文件中用extern 修饰声明全局对象,引用时处添加该头文件。

例如存在三个文件,A.c, A.h,  B.c。B.c 调用A.c中定义的变量ValueA,在A.h中对该变量进行extern声明,A.c中进行定义。

A.c A.h文件内容

//A.h
#idndef __A_H
#define __A_Hextern uint16_t ValueA;//extern 声明#endif//A.c
...
uint16_t ValueA;
...

在B.c中添加A.h头文件进行引用:

//B.c
#include "A.h"
...
printf("ValueA = %d\r\n",ValueA);
...

static的作用与extern相反,被static修饰过的函数或者变量只能在本文件中使用,并且对同一变量或者函数无法同时使用static和extern进行修饰。static根据修饰变量处在的位置不同,其作用域也不同。在函数内部修饰变量(静态局部变量),编译过后该值存放在全局变量处,但作用域只是该函数,即只能该函数使用该变量。在函数外部修饰(静态变量),只能在该文件内使用。

举个例子:一个求和函数的写法,函数递归调用,每次调用的计算结果存在函数的局部静态变量_sum中。

int sum(int m, int n)
{static int _sum = 0;if(m == n){return n;//退出条件}   else{_sum += sum(++m,n);// 递归条件}return _sum;
}

三、extern C 与__cpluscplus

extern C是扩展C的意思,常用在头文件的开头处,写为:extern "C" 。用于描述被它修饰的目标是外部实现的,被它修饰的目标代码是C语言编写的。extern "C" 紧跟花括号{}来指明其作用域,代码和定义等内容放在括号{ }中。

嵌入式开发基本采用C语言,因此在一些头文件中会看到extern C,例如以下头文件代码:

#ifndef __STM32F100xB_H
#define __STM32F100xB_H#ifdef __cplusplusextern "C" {
#endif ...
...#ifdef __cplusplus}
#endif /* __cplusplus */
#endif /* __STM32F100xB_H */

__cpluscplus是C++定义的宏,被定义为一个整形值,随着标准的更新,这个值将增大。在c++03中,__cplusplus定义为199711L;在c++11中,__cplusplus定义为201103L。所以还可以利用__cplusplus对编译器进行检测,看其是否支持c++11。

#if __cplusplus < 201103L#error "should use c++11 implementation"
#endif // __cplusplus

一般来说新建的.cpp文件会定义__cplusplus。

C与C++中的extern与static、extern C与__cplusplus的作用相关推荐

  1. C 中的auto register static extern的使用

    C 存储类 存储类定义C程序中变量或者函数的范围(可见性)和生命周期.这些说明符放置在他们所修饰的类型之前,C中有四个可以使用的存储类. 1 auto 存储类 auto存储类是所有的局部变量默认的存储 ...

  2. C语言extern与static修饰变量

    extern和static在C语言里面的作用这里就不做过多的阐述了,下面直接通过一个小程序来看一看他们修饰的变量的特性. #include <stdio.h>int count = 3;i ...

  3. C C++中关于全局变量静态变量,extern,static,const的区别与总结

    一.extern 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也 ...

  4. C++中关键字的理解--Static

    C++中关键字的理解---Static    目录:1.static缘起             2.static自我理解             3.static举例使用             4 ...

  5. register,static,extern,const,typedef,volatile关键字

    一.register 用register修饰的作用: 请求编译器尽可能(CPU寄存器资源有限)将变量的值保存在CPU内部寄存器中,省去了CPU从内存中抓取数据的时间,提高了程序的运行效率. 何时用re ...

  6. 存储类型auto,static,extern,register的区别

    变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种. 内存中.具体点来说内存分为三块:静态区,堆 ...

  7. 全局变量,extern和static以及命名空间的区别

    全局变量,extern和static以及命名空间的区别        全局变量只是在声明它的文件中有效,假如在另一个文件中声明定义了一个相同名称的全局变量,则在后续使用这两个变量的时候会产生名字上的冲 ...

  8. C语言中auto,register,extern,static【转】

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  9. const、extern、static的使用不再神秘

    验证const: 验证extern: extern的作用是在程序中引入一个全局变量,比如 extern int age:当然这个age变量名在整个程序中只能有一个,否则会发生冲突.而且无论在哪个文件中 ...

最新文章

  1. mysql sys库 oom_MySQL 5.6因为OOM导致数据库重启
  2. 基于信息流的安全格模型
  3. 【转载】关于RabbitMQ的高可用性
  4. CLion 中使用 clang-format
  5. Vue3+Cli4 中使用 Echarts 5
  6. 反应特别慢_孩子反应总是很迟钝?家长多注意一点孩子的兴趣培养
  7. 对java并发性的理解,【图片】你了解过Java并发编程:性能、扩展性和响应的高端操作吗?【java吧】_百度贴吧...
  8. 多方安全计算、联邦学习、可信计算 对比区别
  9. java mysql 周_java 和 mysql 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)...
  10. oracle11数据库下载地址并安装使用
  11. 让你提前认识软件开发(3):学校C语言教材的缺陷
  12. 为何恒星/太阳(辐射)可以被视为黑体(辐射)?
  13. 希尔伯特空间(Hilbert空间)
  14. cass等距离等分线段的命令键_南方cass快捷命令
  15. Linux系统的时区时间设置
  16. 如何提取复杂多引脚芯片的引脚编号及引脚名称
  17. 2022编程语言排名, 后端开发语言选型
  18. MyBatis映射文件如何给数据库的int类型字段“插入”string类型记录
  19. userdel删除用户时候提示:userdel: user xx is currently logged in
  20. 网络基础之传输层协议介绍(“三次握手”和“四次挥手”)

热门文章

  1. HttpHandler
  2. 用OmniPeek快速定义的过滤器来抓网页提交信息
  3. javascript对象包含哪些要素_让人迷糊的JavaScript对象(Object一)
  4. 软件系统换服务器地址,天正软件客户端修改服务器地址
  5. matlab自带kfcm函数,kfcmFun.m
  6. em模型补缺失值_基于EM算法数据单变量缺失处理方法研究
  7. WordPress在前台文章页添加后台编辑该文章按钮
  8. VS.NET版本与VC版本对应关系
  9. [libuv] libuv学习
  10. sscanf函数和正则表达式