【C语言进阶】程序的预处理和预编译详细解读(宏的妙用)

1.程序的运行环境

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

 2.预编译详解

2.1预定义符号

C语言中为我们预定义了一些符号,这些预定义符号是语言内置的

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

可以验证一下:打印我们当前的文件

这些预定义符号都是在预处理阶段就处理的,那么预处理阶段是怎么处理的呢,我们切换到linux系统下进行观察

使用指令:

 预处理 选项 gcc -E test.c -o test.i
预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。
  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5   printf("%s\n",__FILE__);//打印一下当前文件所在的位置                          
  6   printf("%d\n",__LINE__);//打印行号         
  7   return 0;                                                 
  8 }                                                           
~              

 

我们打开test.i发现:

 预处理阶段将我们的预定义符号直接进行了替换

我们可以在来看一下其他几个预定义符号:

 说明:当前的vs不支持标准c的,就是大部分支持但是没有完全实现

3.2 #define

3.2.1 #define 定义标识符
语法:
#define name stuf

#define 可以预定义一个整型值,可以预定义一个字符串,甚至一段代码或者函数

在代码中用到宏定义的地方,在预处理阶段直接进行替换处理,我们先简单看一下使用例子:

 甚至于,我们可以使用我们的预定义来帮我们简写代码,但是1可能可读性不高

#define CASE break;case
int main()
{
	int d = 0;
	switch (d)
	{
	case 1:
	CASE 2 :
	CASE 3:

	}
	return 0;
}

就不用很麻烦的在去写什么case break了,但是代码可读性不高

// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\t line:%d\t date:%s\t time:%s\n",__FILE__,__LINE__,__DATE__,__TIME__)  

 问题:define定义标识符的时候,要不要在最后加上 ; ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值