type
status
date
slug
summary
tags
category
icon
password
标签
Macro
宏定义可以写在程序的任何位置,他的作用范围从定义书写处到文件尾。
可以通过“#undef”强制指定宏的结束范围。
文件包含
格式
- # include <需包含的文件名> ←系统文件夹
- # include “需包含的文件名” ←当前文件夹+系统文件夹
作用
把指定的文件模块内容插入到 #include 所在的位置,当程序编译连接时,系统会把所有 #include 指定的文件拼接生成可执行代码。
注意
编译预处理命令,以#开头。
在程序编译时起作用,不是真正的C语句,行尾没有分号。
Code pre-processing
编译预处理是C语言编译程序的重要组成部分,用于解释处理C语言源程序中的各种预处理命令。
文件包含(#include)和宏定义(#define)都是编译预处理指令
编译预处理的主要功能:
- 文件包含(#include)
- 宏定义(#define)
- 条件编译
题目:C语言的编译系统对宏命令的处理( )。
选项:
A. 在程序运行时进行的
B. 在对源程序中其他语句正式编译之前进行的
C. 在程序连接时进行的
D. 和C程序中的其他语句同时进行编译的
题目:“文件包含”预处理语句的使用过程中,当
#include
后面的文件名用双引号括起来时,寻找被包含文件的方式是( )。选项:
A. 直接按系统设定的标准方式搜索目录
B. 先在源程序所在目录搜索,再按系统设定的标准方式搜索
C. 仅仅搜索源程序所在目录
D. 仅仅搜索当前目录
解析:
当使用双引号
#include "file.h"
时,编译器首先会在源文件所在的目录查找被包含的文件。如果没有找到,才会按照系统设定的标准目录(如系统头文件目录)继续搜索。Conditional compilation
e.g.
程序开始执行。
FLAG 被设置为 1,执行程序段1。
程序结束执行。
Communication between file modules
外部变量
全局变量只能在某个模块中定义一次,如果其他模块要使用该全局变量,需要通过外部变量的声明
外部变量声明格式为: extern 变量名表;
如果在每一个文件模块中都定义一次全局变量,模块单独编译时不会发生错误,一旦把各模块连接在一起时,就会产生对同一个全局变量名多次定义的错误。
反之,不经声明而直接使用全局变量,程序编译时会出现“变量未定义”的错误。
外部函数
外部函数声明格式为:extern 函数类型 函数名(参数表说明);
Variables
Global Variables
定义
全局变量是在所有函数外部(通常在文件的顶部)声明的变量。它们在整个程序的生命周期内都存在,并且可以被程序中的所有函数访问(取决于其链接性)。
特点
- 存储区域:静态存储区(数据段)。
- 生命周期:从程序开始运行到程序结束。
- 作用域:全局(整个文件和其他文件,视链接性而定)。
- 链接性:
- 默认情况下,具有外部链接性(external linkage),可以在多个文件中访问。
Static Global Variables
定义
静态全局变量是使用
static
关键字在文件顶部(所有函数外部)声明的变量。与普通全局变量相比,静态全局变量的链接性是内部链接性(internal linkage),即只能在声明它们的文件中访问,无法在其他文件中引用。特点
- 存储区域:静态存储区(数据段)。
- 生命周期:从程序开始运行到程序结束。
- 作用域:仅限于声明它的文件内部。
- 链接性:内部链接性,无法被其他文件访问。
Static Local Variables
定义
静态局部变量是在函数内部使用
static
关键字声明的变量。它们具有静态存储期限(static storage duration),即在程序运行期间一直存在,但其作用域仍然是函数内部。特点
- 存储区域:静态存储区(数据段)。
- 生命周期:从程序开始运行到程序结束。
- 作用域:仅限于声明它的函数内部。
- 链接性:无链接性,仅在声明它的函数内可见。
Dynamic Variables
定义
动态分配的变量是在程序运行时通过动态内存分配函数(如
malloc
、calloc
、realloc
)分配的内存区域。这些变量不属于静态存储区或栈,而是位于**堆(heap)**中,需要程序员手动管理内存(分配和释放)。特点
- 存储区域:堆(heap)。
- 生命周期:由程序员控制,从分配到显式释放。
- 作用域:通过指针访问,作用域取决于指针的作用域。
- 链接性:无内在链接性,取决于指针的声明。
- Author:烬
- URL:https://myyzgg.top/article/16ac1181-e738-8078-a351-fbc1c5049b97
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!