声明v.s.定义

本文详细解释了C语言中变量的定义、声明、初始化的区别,强调extern关键字的作用,以及模块化编程中的接口声明和静态变量的使用。特别指出只有extern声明在函数外部时才能初始化,并讨论了const变量和inline函数的特殊情况。
摘要由CSDN通过智能技术生成

参考:http://t.csdnimg.cn/1xnzA

  1. 变量的定义:用于为变量分配存储空间,还可以为变量指定初始值,在程序中,变量有且仅有一个定义。
  2. 变量的声明:用于向程序表明变量的类型和名字。在程序中,变量可以声明多次。
  3. 定义也是声明:当定义变量的时候我们声明了它的类型和名字。
  4. 不定义变量的声明:通过使用关键字extern声明变量名而不定义它。“extern+对象类型+对象名”
    1. extern声明 不会为变量分配存储空间,只是说明变量定义在程序的其他地方。
  5. 有初始化式的声明必是定义
    1. 初始化式:int a = 10;
    2. 因为初始化式必须要有存储空间来进行初始化。
    3. 只有当声明也是定义时,声明才可以有初始化式,因为只有定义才会分配存储空间。
    4. 如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern。extern int a = 10;但是只有当extern声明位于函数外部时,才可以被初始化。当初始化位于函数内部的extern声明时,编译器报错。
  6. 函数的声明和定义:带有{ }的就是定义,否则就是声明。
    1. extern double max(double d1,double d2); //声明
  7. 任何在多文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。
  8. 模块化要点:
    1. 模块即是一个.c文件和一个.h文件的结合,头文件.h中是对于该模块接口的声明。
    2. 某模块提供给其他模块调用的外部函数以及数据需要在.h文件中冠以extern关键字声明。可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。
    3. 模块内的函数和全局变量需要在.c文件开头冠以static关键字声明;尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。
    4. 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
    5. 例外:以下三种实体的定义也可放到头文件中:
      1. 值在编译时就已知的const 变量的定义可以放到头文件中,如:const int num(10);
      2. inline 函数
      3. 类的定义可以放到头文件中
//如果声明有初始化式,它就被当作定义,即使它有extern
//只有extern声明位于在函数外面时,才可以被初始化。
//C语言中定义的变量默认就是extern的,因此 extern int a = 10; 等价于 int a = 10;
extern int a = 10;	// 定义a为外部的整型变量

int main(void)
{
    extern int a;	//声明一个外部extern的整型变量
    //  这是个声明而不是定义,声明a是一个已经定义了的外部变量
    //  注意:声明外部变量时可以把变量类型去掉如:extern a;

    int b;                  //  定义一个变量, 不初始化
    int c = 10;             //  定义一个变量, 同时进行初始化

    extern int d = 10;		//这个定义很明显被gcc编译器认为是错误的。
    //'d' has both 'extern' and initializer

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值