C学习---程序结构

今天继续学习c语言语法,相对之前的知识而言,这次的知识就比较重要了,算是C语言的核心基础了,所以得好好学它,下面正式开始:

存储类别: 它指定了变量生存期(时间)与作用域(空间)

对于下面这个函数:

运行结果:

解析:

静态变量,只分配一次内存,离开作用域的时候,生存期并未结束,它的生存期是整个程序的执行期[这也说明作用域和生存期是不一样的],所以上面执行了两次的结果累加了。

另外,需要注意:

关于这个可以参考博文:变量 - cexo - 博客园,里面有详细的说明。

下面有两个C文件:

test.c的内容:

1_9.c的内容:

这时编译两个c到一个可执行文件:

解决之道,就是将test.c的文件中的全局变量声明为static的,因为static修饰全局变量,它的作用域只限本文件中,对于1_9.c是看不到的:

这时编译就成功了:

这个依照静态全局变量的,就很容易理解了:

test.c:

1_9.c:

这时编译:

将test.c的函数声明为静态的,这时就成功了:

提示:不管是局静态局部变量还是静态全局变量生存期是整个程序执行期

修饰变量:

还是两个.c文件:

test.c声明一个全局变量:

而如果1_9.c想直接用这个变量会怎么样呢?

那如果就是想用test.c定义的全局变量呢,这时extern就派上用场了:

再次编译,这回就成功了:

修饰函数:

test.c:

1_9.c:

编译貌似没有报错:

但如果把警告打开再编译一下:

所以,并非直接能调用其它文件声明的全局函数,而还得用上extern来解决:

这时再编译:

 实际上,对于函数,extern关键字可以省略,但是变量则不行,如下:

另外,还有两个修饰关键字,可以了解一下:

标识符的五种作用域[了解下既可!]:

①只能在函数体中引用

②标签号(用于goto)是唯一具有函数作用域的标识符

①在程序块中声明的标识符具有块作用域,块作用域开始于声明处,结束于程序块的右花括号

很容易理解,平常只是我们没将它理论化而已:

②函数的形式参数、函数的局部变量、在复合语句中声明的变量具有块作用域

③如果外层块和内层块有相同名字的变量,外层说明会被内层说明屏蔽(最近嵌套原则)

在一个程序文件的所有函数定义之外定义的标识符,则该标识符具有全局作用域,即该标识符在整个程序包括的所有文件中都有效,都是可见的,都是可以访问的。

也就是extern全局变量, extern函数

在函数外面定义的标识符并且用static修饰,能够被从标识符说明到文件结束之间的所有函数引用

也就是static全局变量、static函数定义或函数原型

预处理指令:

下面有三个文件:test.c、test.h、1_9.c,来演示一下预编译指今的用法:

它们的关系如下:

test.h:

// ifndef defing endif 是为了防止重复包含头文件
#ifndef _TEST_H_
#define _TEST_H_

void fun(void);//声明了函数


#endif /* _TEST_H_ */
test.c:

#include <stdio.h>

void fun(void)
{
    printf("hello fun test ...\n");
}
1_9.c:

#include <stdio.h>
#include "test.h"//包含头文件

int main(void)
{
    fun();
    return 0;
}

运行:

将函数放到.h里面声明的好处,可以复用,需要调用的.c文件中只需包含一下.h文件既可,另外,全局变量最好不要定义.h头文件中,而应该放到.c文件中

为了说明这个原因,再增加一个.c文件,如下:

里面啥都不做,只包含头文件:

这时在.h中声明一个全局变量,注意:不是static的:

test.h:

我们知道1_9.c也包含了test.h头文件,也就是test.h现在被test2和1_9.c所包含,这时编译:

这也就是为什么全局变量最好不要定义.h头文件中的原因了,当被多个文件包含时就会出现上面的错误,虽说在.h中已经有重复定义的判断了,那怎么解决呢?

解决方法如下:

test.c:

test.h:

这时,其它都不用变,test.h还是被两个文件同时包含,再编译就成功了:

条件编译:

下面举一个在程序中使用条件编译的用法:

默认编译运行:

这时我们在文件中定义一个DEBUG宏:

另外,也可以不在程序中加入这个宏的定义,而在gcc编译时携带参数来编译出带这个宏的可执行文件:

先将宏定义从源文件去掉:

好了,这次的内容就学到这,里面的东西需细细体会,这也基础知识也是助自己深入学习C很有利的因素,之后就已经到了C语言的最核心的部分了,所以需不骄不躁,一步一个脚印学习。

关注个人公众号,获得实时推送

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webor2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值