浅谈 变量以及函数的声明以及定义,以及对extern “C”的理解

       这两天做一个工程,需要在c++编译器下对c语言的程序进行编译,自己便对extern “C”做了一些研究,以及对函数以及变量的定义以及声明做了一些学习,现介绍自己的学习心得如下:


 一、 函数的声明与定义

     对于函数而言,定义与声明比较好理解,像我们日常常用的在头文件中进行函数声明,然后在.cpp文件中进行定义,需要用到函数的时候,在使用函数的文件中 include“xxx.h” 便可以使用定义的函数了。

     这里需要提醒的是:

       1、在头文件中只进行声明,不进行定义,因为如果在头文件中进行定义的话,如果你在多个.cpp文件中要引用这个头文件那么会产生多重定义的错误的。

       2、函数的声明在前面加上“extern”,如extern int func(); 表明被修饰的函数定义在当前文件外,但是函数的声明默认便是extern的所以不需要加extern也是一样的。

       3、函数的声明前面加上“static”,表明该函数是一个静态函数,作用便是该函数只能在当前文件中被使用,其他文件中不可以使用。减小了函数的作用范围。


二、变量的声明与定义

     对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如int a;);另一种是不需要建立存储空间的(如extern int a;)。前者称为定义性声明(defining declaration),或简称为定义(definition)。后者称为引用性声明(referenceing declaration)。广义地说,声明包括定义,但并非所有的声明都是定义。对“int a;” 而言,它是定义性声明,既可说是声明,又可说是定义。而对“extern int a;” 而言,它是声明而不是定义。一般为了叙述方便,把建立存储空间的声明称为定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。例如:
int main( )
{
    extern int a; //这是声明不是定义。声明a是一个已定义的外部变量
}
int a;  // 是定义,定义a为整型外部变量

这些都比较好理解,下面我想要讲的是extern 以及 static

    1、全局变量 static int a ; 与 int a  的区别

        定义全局变量,前面是否加static都会将该全局变量定义为静态变量,所不同的是,加上static后该全局变量的作用范围只限在当前文件,无法再外部文件进行调用,而不加static的全局变量可以在外部文件进行访问,访问方法为extern int  a;

    2、extern int  a;

        extern int  a是一种变量声明,不是定义。这样用代表三层含义,首先,变量a不是在当前文件中,这是一种调用外部定义的变量的方法,不然你无法访问外部变量;其次,a是一个全局变量,extern只针对全局变量有效,对于局部变量不起作用(我想也不会有人想要引用其他文件中的函数中的局部变量吧),最后,这个变量a一定是一个可以被外部访问的变量即其不是static 修饰的,如果变量被static修饰(上一条)则不可以在外部函数调用。


三、extern "C"

        这个声明主要用于在c++编译环境下要使用c语言的函数,需要对c语言的函数按照c语言的标准来进行编译,不然会出现错误,错误基本都是“找不到函数名字”。那么为什么需要这样呢,我来解释一下。我们知道c++支持函数的重载,即相同的函数名字可能会存在多个函数,那么c++编译器是如何进行处理的呢? 举个例子,int fun(int a);对于这个函数,在c++环境下进行编译,会生成函数名 _funxx@sshahahf 反正是一个看不懂的名字,但是如果在c语言的编译器下面进行编译会生成一个名字_fun就是原函数的名字,这样就会导致如果 c语言的函数在c++下面是找不到函数与之对应的,这样就会导致前面说到的错误了。所以我们在编译c语言的时候就要告诉c++编译器,这些函数按照c语言的标准来做,这样自然c++编译器便可以找到函数名字了,其实就是你需要用extern "C"来强制编译器不要修改你的函数名。

 比较常用的格式如下:

#ifndef __INCvxWorksh  /*防止该头文件被重复引用*/
#define __INCvxWorksh

#ifdef __cplusplus    //__cplusplus是cpp中自定义的一个宏
extern "C" {          //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的
#endif

    /**** some declaration or so *****/  

#ifdef __cplusplus
}
#endif

#endif /* __INCvxWorksh */

此网站对extern "C" 有比较详细的介绍,读者可以参考

http://www.jianshu.com/p/5d2eeeb93590

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值