【C语言】熟悉预处理标识符和宏

此次分享的是预处理相关的知识,如有错误,请指出。

1.预定义符号

__FILE__         //进行编译的源文件

__LINE__        //文件当前的行号

__DATE__      //文件被编译的日期

__TIME__       //文件被编译的时间


如:

printf("file:%s\tline:%d\tdata:%s\ttime:%s\n",__FILE__,__LINE__,DATE__,__TIME__);

这样就可以输出当前编译文件的相关信息了。


2.#define

#define  name  stuff

有了这条指令,每当有符号name出现在指令后面时,预处理器就会把它替换成stuff.

替换文本并不仅限于数字字面常量,还可以把任何文本替换到程序中。

如:

#define reg register     //为register这个关键字,创建一个简短的名字


2.1宏

#define机制允许把参数替换到文本中,    这种实现通常称为宏或定义宏(宏函数)。

定义格式为:

#define name (parament-list)  stuff

如:

#define SQUARE(x)  ((x)*(x))


这个宏函数接受一个参数。如果在上述声明之后,你把SQUARE(10)置于程序中,预处理器就会用已下表达式替换上面的表达式:

10 * 10

注意:

所用用于对数值表达式进行求值的宏定义,不仅要对参数带上括号,也要给运算整体带上括号。避免在使用宏函数时由于参数中的操作符或

邻近操作符之间不可预料的相互作用。


2.2#define定义符号和宏,替换的过程

涉及⼏个步骤。
1、在调⽤宏时,⾸先对参数进⾏检查,看看是否包含任何由#define定义的符号。如果是,它们⾸先被替换。
2、替换⽂本随后被插⼊到程序中原来⽂本的位置。对于宏函数,参数名被他们的值替换。
3、最后,再次对结果⽂件进⾏扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。


2.3扩展

如果想让宏进行输出,使其具有输出特性,可以使用以下技巧。

1.邻近字符串连接特性。这个特性可以使我们很容易把⼀个字符串分成⼏段。

#define M 9
#define PRINT( FORMAT, VALUE) \
printf("the value is " FORMAT"\n" , VALUE);
PRINT("%d" ,M);



2.使⽤预处理器将⼀个宏参数转换为⼀个字符串。(#VALUE 这种结构被处理器翻译为"VALUE")

#define M 9
#define PRINT( FORMAT, VALUE ) \
printf("the value of " #VALUE" is " FORMAT"\n",   VALUE);
PRINT("%d" ,M);



3.##结构则执⾏⼀种不同的任务。它把位于它两边的符号连接成⼀个符号。

作为⽤途之⼀,它允许宏定义从分离的⽂本段创建标识符。
如:

#define   STR1  "aa"
#define   STR2  "bb"
#define   STR1STR2   "welcome"
#define   CAT(STR1,STR2)   STR1##STR2  
int main()
{
	printf("%s\n" ,CAT(STR1,STR2));
	return 0;
}


结果是: welcome






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值