深入浅出C语言(3)----声明与定义

声明的存在意义是告诉编译器有这个东西,不占用存储空间,而定义则是要实实在在的,是需要占用存储空间的。

示例1:
我们先声明一个结构体,如下:

 Struct student{
   int num;
   Char name[20];
};

这是一个声明,不占用任何存储空间。
Struct student a; //这是一个定义了

当编译器扫描到这句的时候,首先看到struct student,编译会找这个struct student的所声明的形式,然后根据前面我们所声明的结构体给a分配相应的存储空间。

示例2:
//file main.c
void main()
{
    test();
}

void test()
{
}

编译器是从上到下扫描源代码的,当扫描到main函数中的 test()的时候,编译器这个时候会傻了,因为前面它没有见过这个函数。这个时候编译器会报错,说找不到test()的定义。
咋办呢??我们在调用test()之前告诉编译器有这个东西。也就是我们所说的声明。
一般我们习惯这样写:

//file main.c
void test(); //这里是声明,告诉编译器当前的.c文件有这个东西,
void main()
{
   test();
}

void test()
{
}

其实,我们也可以这样写:
//file main.c
void main()
{
   void test();   //这里是声明,最终的代码中没有这句code
    test();        //实实在在的调用,最终的代码中是有这句code
}

/*这里是定义,最终的代码中是会存在这个函数的*/
void test()
{
}

 

示例3:
//file hello.c
void test()
{
}

 

//file main.c
extern void test();    //声明,加上extern,就是告诉编译器test函数不在当前.c中,而是在其他的.c中,编译器遇到的时候,
                       //先不要报错,具体在链接的时候,再找这个test()函数的具体实现.

void main()
{
    test();
}

 

示例4:
//hello.c
int a = 0;  //一个全局变量,在程序的全局区
//main.c
void main()
{
  extern int a ;  //告诉编译器a的声明不在当前的.c中,而是在其他的.c中
  a++;
}

 

综上所述:声明的主要目的是告诉编译器有这个东西,编译器在没有遇到所声明东西的具体定义之前也充许代码先使用,等到后绪的时候再补上即可。因此声明的代码是不被编译到真正的执行的二进制代码中去的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值