浅谈预处理标识符

简单认识c标准指定的一些预定义宏:

__DATA__   文件被编译的日期(例为:Oct 17 2016 形式的字符串文字)

__FILE__     代表进行编译的源文件 

__LINE__     代表文件中__LINE__ 所在位置的当前行号

__TIME__    源文件被编译的时间(例为:14:50:46 )

__STDC__  如果编译器遵循ANSI C,其值为1,否则为0;


这些是预定义宏,直接可以拿来使用;对于以上几个预定义主要是用来输出当前被编译的源文件的信息;当多个文件进行编译时,可以用来输出简单的日志文件,在代码中出错的那一行打印这些预定义宏可以轻松的找出出错文件的信息;


宏中的#功能:在宏函数中使用,是将其后紧跟的宏参数进行字符串化的操作;在解释#功能之前先说一下printf函数中

邻近字符串连接特性,即printf("hello "" csdn");这个打印出来是一个字符串,和printf("hello  csdn");的效果是一模一样的;此处要注意的是printf("");引号中的内容被看做普通文本,在宏函数中若宏参数在引号内包含,是不会被替换;例如:

#define PRINT(FORMAT )\
	printf("this value of FORMAT is %d\n",FORMAT)

int main()
{
	PRINT(6)	;
	

	//system("pause");
	return 0;
}

输出为:this value of FORMAT is 5;

而对于:

#define PRINT(FORMAT )\
printf("this value of "# FORMAT"is %d\n",FORMAT)
int main()
{
	PRINT(5);
	system("pause");
	return 0;
}


在预处理时需要进行宏替换,识别到PRINT是一个宏,然后对宏参数进行替换,先将#FORMAT替换为#5,#进行字符化操作后:"5",后面的FORMAT也被替换为5.替换后为:printf(" this value of " "5" " is \%dn",5 );输出为this value of 5 is 5;

宏中##的功能:它把位于它两边的符号连接成一个符号

看例子:

#define INOS(STR1,STR2) STR1##STR2
#define STR1 printf("str1");
#define STR2 printf("str2");
#define STR1STR2 printf("str1str2");
int main()
{
	
	INOS(STR1,STR2);

	system("pause");
	return 0;
}


最终的输出结果为:str1str2;

INOS的作用就是将##左边的STR1和右边的STR2粘合为STR1STR2;最终是STR1STR2进行宏替换;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值