C语言预处理详解!

目录

一、程序环境

1.程序的翻译环境和执行环境

2.编译

2.1翻译环境

2.2编译阶段 

2.3运行环境

程序执行的过程:

二、预处理详解

1.预定义符号

2.#define

2.1#define定义标识符

2.2#define定义宏

2.3#define 替换规则

 2.4#和##

1.# 的使用

 2.##的使用

 2.5带副作用的宏参数

 2.6宏和函数的对比

2.7命名约定

3.#undef

4.命令行定义

 5.条件编译

6.文件包含

1.头文件包含方式:

1.本地文件:

2.库文件包含:

2.嵌套文件包含 


一、程序环境

1.程序的翻译环境和执行环境

(1)翻译环境,在这个环境中源代码被转换为可执行的机器指令。
       (C语言代码——>二进制指令(可执行的程序))
(2)执行环境,它用于实际执行代码。(执行二进制的代码)

2.编译

2.1翻译环境

vs2019集成开发环境:编译器(cl.exe) + 链接器(link.exe)+ 调试器

2.2编译阶段 

2.3运行环境

程序执行的过程:

1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2. 程序的执行便开始。接着便调用main函数。
3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。
4. 终止程序。正常终止main函数;也有可能是意外终止。

二、预处理详解

1.预定义符号

__FILE__       // 进行编译的源文件
__LINE__     // 文件当前的行号
__DATE__     // 文件被编译的日期
__TIME__     // 文件被编译的时间
__STDC__     // 如果编译器遵循 ANSI C ,其值为 1 ,否则未定义(在vs中未定义,vs不支持)

这些预定义符号 都是语言内置的。

举个例子: 

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("File:%s line=%d date:%s time:%s i=%d\n", __FILE__, __LINE__, __DATE__, __TIME__, i);
	}
	return 0;
}

2.#define

2.1#define定义标识符

语法: #define name stuff

举例:

#define MAX 100
#define CASE break;case

如果定义的stuff过长,可以分成几行写,除了最后一行,每行的后面都加上一个反斜杠(续行符)续行符后面直接加回车键,不能加别的东西,否则会显示错误!(空格也不行)

举个例子:

#define DEBUG_PRINT printf("file:%s\tline:%d\tdate:%s\ttime:%s\n",__FILE__,__LINE__ ,__DATE__,__TIME__ )

//改后

#define DEBUG_PRINT printf("file:%s\tline:%d\t\
date:%s\ttime:%s\n",\
__FILE__,__LINE__ ,\
__DATE__,__TIME__ )

 那么有个问题,在#define定义标识符的时候,要不要在后面加上';'?

比如:

#define MAX 100;

#define MAX 100

 建议不要加;,容易导致问题:

#include <stdio.h>
#define MAX 100;

int main()
{
	int max = 0;
	if (1)
		max = MAX;
	else
		max = 0;
}

这里 如图所示,这里的 ; 会被认成一行语句,所以会报错

2.2#define定义宏

#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义 宏(define macro)。

 宏的申明方式:#define name( parament-list ) stuff

其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。

注意:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值