预处理命令20240201

本文详细解释了C语言中局部变量和全局变量的作用域、可见性规则,以及生存期、不同修饰符如auto和register的使用。同时介绍了预处理命令、宏定义、延迟包含和文件包含的原理,以及条件编译在避免重复和控制代码执行的技巧。
摘要由CSDN通过智能技术生成

局部变量和全局变量

标识符的作用域和可见性

作用域

全局作用域、局部作用域

作用域允许存在包含关系,所有的局部作用域被包含在全局作用域里,局部作用域也可以包含局部作用域。

g 是全局变量

#include<stdio.h>

int g;
int main(void)
{
    int i ;
    {
        int j;
    }
    return 0;
} 

如果用全局变量传参,耦合性太高,尽量用形参传参。

如果全局变量未被初始化,其值为0,而不是随机数。在全局区的变量如果未被初始化,都为0。

可见性

1.标识符必须先定义在使用;

2.同一作用域中不得出现同名标识符;

3.在没有包含关系的不同作用域中,定义同名标识符,互不影响;

4.在两个或两个以上具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见。

变量的生存期

静态生存期:全局变量具有静态生存期,与程序运行周期相同,空间开辟时间在第一条语句之前,空间销毁在最后一条语句之后。 全局变量,static修饰的局部变量。

动态生存期:在栈区的,局部变量、形参.

stctic + 全局变量\函数  限制使用范围仅本身.c文件可以使用

关键字

auto 关键字

自动的,可以被省略

register 关键字

寄存器,在CPU内部

register int i; 提高效率;  建议并不是命令

由register修饰的变量不可以取地址

:vsp func.c  分屏

:set mouse=a

:sp func.h   头文件中只放声明,不放定义

在func.h 只放声明,全局变量或者函数

用extern声明外部变量

在extern后面的是声明,不是定义

预处理命令

可以改进程序设计环境,提高编程效率

宏定义

不带参宏

#define  标识符   字符串

宏名所有的字母都大写

gcc -E  通知编译器只做预处理命令不编译

宏定义最后不加分号

程序的行数,程序的文件名

带参宏

#dedine ADD(a,b) a + b

int main(void)
{
    printf("%d\n",ADD(10,20));

    return 0;
}

带参宏跟函数有本质的区别:带参宏效率高,但是代码复用性低

(宏函数的说法❌)

延迟包含:尽量在源文件包含

“文件包含”处理

一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件中。

一般形式为:

#include<文件名>  或者#include"文件名"

头文件除了可以包括函数原型和宏定义外,也可以包括结构体类型定义和全局变量定义。

条件编译

1.#if 0

  #endif

2.#ifdef    标识符(不带参宏)

#endif

int main(void)
{
#ifdef k
    puts(""hello);
#endif
    puts("world");
    return 0;
}

如果之前没有被定义K,puts("Hello")为假,不打印

3.#ifndef

  #endif    如果没有定义过,为1

防止重复包含造成的错误

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值