C语言-预处理指令

C语言-预处理指令,第1张

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

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

举个栗子:

printf("line:%d date:%s\n",__LINE__,__DATE__);

可以发现我们没有定义这些符号,但它们可以被直接使用。

2.#define 2.1 #define定义标识符

语法:

#define name stuff

举个栗子:

#define MAX 1000                //定义一个标识符常量
#define reg register            //将关键字register简化为reg
#define do_forever for(;;)      //用更形象的方式来替换一种实现
#define CASE break;case         //在写case语句时自动把break自动加上
#define DEBUG_PRINT printf("file:%s line:%d \
date:%s time:%s\n",__FILE__,__LINE__,__DATE__,\
__TIME__);                                  //在stuff定义的过长的时候,可以分成几行写,除最后             
                                            //一行外,每行的后面都加一个\(续行符)

那define定义的时候后面要不要加一个分号“ ;”呢?

#define MAX 100;

建议不要,因为这样容易导致问题

比如:

int max=MAX;

 这样替换后就会出现语法错误

2.2 #define定义宏

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

#define name(parament-list) stuff

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

注意:

参数列表的左括号必须与name紧邻

如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分

举个栗子

#define SQUARE(x) x*x
int a=6;
printf("%d\n",SQUARE(a+1))

乍一看,是不是觉得要打印49?

但事实上,它打印12

因为#define在预处理时会被替换文本,参数x被成a+1,那实际上语句就为

printf("%d\n",a+1*a+1);

 所以在进行宏定义时,要想得到想要的结果,要加上括号

#define SQUARE(x) ((x)*(x))
2.3 #define的替换规则 

在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

1.在调用宏时,首先对参数进行检查,看看是否包括任何#define定义的符号。

如果有,它们首先会被替换。

2.在替换文本随后被插入到程序中原本文本的位置。

对于宏,参数名被它们的值替换。

 

3.最后,再次对结果文件进行扫描,看看它是否包括任何由#define定义的符号,如果是,就重复上述过程。

要注意的是:

1.宏参数和#define定义中可以出现其他#define定义的符号,但对于宏,不能出现递归。

2.当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662066.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存