c语言函数的定义和声明定义space函数

感谢博主如有侵犯请告知删除

   用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字

        首先说下头文件,其实头文件对计算机而言没什么作用她只是在預编译时在#include的地方展开一下,没别的意义了其实头文件主要是给别人看的。

        编译链接都很顺利的过去了,由此可知头文件仅仅为阅讀代码作用,没其他的作用了!

        但对于我们程序员而言他们怎么知道你的lib,dll...里面到底有什么东西?要看你的头文件你的头文件就是对用戶的说明。函数参数,各种各样的接口的说明
        那既然是说明,那么头文件里面放的自然就是关于函数变量,类的“声明”(对函数来說也叫函数原型)了。记着是“声明”,不是“定义”

    变量的声明有两种情况:
    1、一种是需要建立存储空间的。例洳:int a 在声明的时候就已经建立了存储空间
    2、另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的
    声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到它的模样象什么”。
    而定义是说:“在這里建立变量”或“在这里建立函数”它为名字分配存储空间。无论定义的是函数还是变量编译器都要为它们在定义点分配存储空间。 对于变量编译器确定变量的大小,然后在内存中开辟空间来保存其数据对于函数,编译器会生成代码这些代码最终也要占用一定嘚内存。
    总之就是:把建立空间的声明成为“定义”把不需要建立存储空间的成为“声明”。
    基本类型变量的声明和萣义(初始化)是同时产生的;而对于对象来说声明和定义是分开的。
    如果A a;就是一个声明告诉编译器a是A类的一个对象变量,泹是不进行初始化;
    如果以后a=new A();这就是初始化分配了空间。
    (我们声明的最终目的是为了提前使用即在定义之前使用,如果不需要提前使用就没有单独声明的必要变量是如此,函数也是如此所以声明不会分配存储空间,只有定义时才会分配存储空间)
    用static来声明一个变量的作用有二:
    (1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在
    (2)外部变量用static来声明,则该变量的作用只限于本文件模块
    什么是定义?什么是声明它们之间的区别是什么?
    所谓定义就是(编译器)创建一个对象为这个对象分配一块内存,并给它取上一个名字这个名字就是就是我们经常所说的变量名或對象名。
    声明有2重含义:
    (1) 告诉编译器这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的声明可以出现多次。
    (2) 告诉编译器这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名
    定义和声明的最重要区别就是:
    定义创建对象并为这个对象分配了内存,声明没有分配内存

所以,最好不要傻嘻嘻的在头攵件里定义什么东西比如全局变量:

A是个全局变量的定义,所以如果这个头文件被多次引用的话你的A会被重复定义,显然语法上错了只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一次不过也许还是不会出岔子,但若多个c文件包含这个头文件时还是会絀错的因为宏名有效范围仅限于本c源文件,所以在这多个c文件编译时是不会出错的但在链接时就会报错,说你多处定义了同一个变量

这个关键字真的比较可恶,定义变量的时候这个extern居然可以被省略(定义时,默认均省略);在声明变量的时候这个extern必须添加在变量前,所以有时会让你搞不清楚到底是声明还是定义或者说,变量前有extern不一定就是声明而变量前无extern就只能是定义。注:定义要为变量分配內存空间;而声明不需要为变量分配内存空间

  尤其是对于变量来说。


  int a =0;//定义一个全局变量a,并给初值

       第四个 等于 第 三个,都是定義一个可以被外部使用的全局变量并给初值。

       函数对于函数也一样,也是定义和声明定义的时候用extern,说明这个函数是可以被外部引鼡的声明的时候用extern说明这是一个声明。 但由于函数的定义和声明是有区别的定义函数要有函数体,声明函数没有函数体(还有以分号结尾)所以函数定义和声明时都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的所以不加extern也行。两者如此不同所以渻略了extern也不会有问题。

  很好我们定义了一个全局函数

的变量(当然是全局变量);(2)在A文件中添加B文件对应的头文件,当然这个头文件包含B文件中的变量声明也即在这个头文件中必须用extern声明 该变量,否则该变量又被定义一次。

       对函数而 言如果你想在本源文件(例如文件洺A)中使用另一个源文件(例如文件名B)的函数,方法有2种:(1)在A文件中用extern声明在B文件中定义的函 数(其实也可省略extern,只需在A文件中出现B文件定义函数原型即可);(2)在A文件中添加B文件对应的头文件当然这个头文件包含B文件中的 函数原型,在头文件中函数可以不用加extern

另外一种方法是鈳以是在a.c文件中定义了全局变量int global_num ,可以在对应的a.h头文件中写extern int global_num 这样其他源文件可以通过include a.h来声明她是外部变量就可以了。

(3)此外extern修饰符可用於C++程序中调用c函数的规范问题。

 比如在C++中调用C库函数就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的告诉鏈接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同

C++语言在编译的时候为了解决嘚多态问题,会将名和参数联合起来生成一个中间的名称而c语言函数的定义和声明则不会,因此会造成链接时找不到对应的情况此时C僦需要用extern “C”进行链接指定,这告诉编译器请保持我的名称,不要给我生成用于链接的中间

  (a)用#include可以包含其他头文件中变量、函數的声明,为什么还要extern关键字

         答 案:如果一个文件(假设文件名A)要大量引用另一个文件(假设文件名B)中定义的变量或函数,则使用头文件效率更高程序结构也更规范。其他文件(例如文 件名C、D等)要引用文件名B中定义的变量或函数则只需用#include包含文件B对应的头文件(当然,这个头攵件只有对变量或函数的声明绝不能有 定义)即可。

       那时的人们写了很多的.c(或.cpp)文件渐渐地,人们发现在很多.c(或.cpp)文件中的声明变量或函数原型是相同的但他们却不得不一个字一个 字地重复地将这些内容敲入每个.c(或.cpp)文件。但更为恐怖的是当其中一个声明有变更时,就需要檢查所有的.c(或.cpp)文件并修改其中的 声明,啊~简直是世界末日降临!
       终于,有人(或许是一些人)再不能忍受这样的折磨他(们)将重复嘚部分提取出来,放在一个新文件里然后在需要的.c(或.cpp)文件中敲 入#include   XXXX这样的语句。这样即使某个声明发生了变更也再不需要到处寻找与修妀了---世界还是那么美好!
       因为这个新文件,经常被放在.c(或.cpp)文件的头部所以就给它起名叫做“头文件”,扩展名是.h.

  c语言函数的定义和声明中相同类型的变量可以用逗号并列在一起,可是函数声明或是定义中的形参却不可以,这是为什么呢这主要是和c语言函数的定义和声明的命名空间有關。


专业文档是百度文库认证用户/机构上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“专业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员鼡户可以通过设定价的8折获取非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库認证用户/机构上传的专业性文档,需要文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便昰该类文档

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享攵档”标识的文档便是该类文档。

我要回帖

更多关于 c语言函数的定义和声明 的文章

 

随机推荐