C编程之预处理标识符——__LINE__,__FILE__,__DATE__,__TIME__,__STDC__,#,##

常用的预定义符号:

    1. __FILE__     :    file顾名思义,也就是进行编译的源文件所在目录。
    2. __LINE__     :   line表示进行编译的当前文件当前所在的行号。
    3. __DATE__   :    date表示当前文件被编译的日期。
    4. __TIME__    :    time即⽂件被编译的时间,精确到秒。
    5. __STDC__   :    stdc表示如果编译器遵循ANSI C,其值为1,否则未定义

    6. #         

    7. ##

      下面我们来看一段代码加深理解:


<pre class="cpp" name="code"><span style="font-size:24px;">#include<stdio.h>
int main()
{
	printf ("file:%s\tline:%d\tdate:%s\ttime:%s\t%d\n",\
		__FILE__ ,__LINE__,__DATE__,__TIME__,__STDC__ );
	return 0;
}</span>

 
 
      上面代码在Linux(centos)下运行结果如下图:

             

      文件所在位置csdn.c,当前行数为5即从代码第一行#include<stdio.h>开始向下数第五行,日期时间也都准确打印出来,需要我们注意的是stdc打印出的1,也就是说centos环境遵循ANSI C。
       下面我们来看一下这段代码在vs2008编译器下的stdc打印情况:

            

      编译器提示__STDC__是未声明的标识符,即未定义,也就是说vs2008编译器不遵循ANSI C。下面我把__STDC__删掉,我们来看一下运行结果:

       

大家可以看到file显示当前文件所在目录是在f盘下的一个csdn.c里,行数,日期,时间也依次打印出来。
      #和##的使用就要说到宏了。我们先来看一段代码:

<pre class="cpp" name="code"><span style="font-size:24px;">#include<stdio.h>
#include<windows.h>
#define M 10

#define PRINT( FORMAT, VALUE ) \
	printf("the value of "#VALUE" is " FORMAT"\n", VALUE)
int main()
{

	PRINT("%d", M);
	system("pause");
	return 0;
}</span>

 
       (printf函数是具有可变参的,也就是说它可以有很多个参数。)
      下面我们来看一下运行结果:
      
      我们可以看到printf函数的参数“the value of ”和“ is”中间多了一个字符M,而宏定义中,两个参数中间是#VALUE,也就是说在生成可执行程序过程中,#VALUE换成了字符M。其实宏是可以嵌套使用的,这里预处理时,系统会检测到宏PRINT中嵌套了宏M,这时候,VALUE = M。 #VALUE这种形式在预处理时被编译器翻译成字符串,即“M”。
      而##结构的功能是把位于它两边的符号连接成一个符号。举个例子:
<pre class="cpp" name="code"><span style="font-size:24px;">#include<stdio.h>
#include<windows.h>
#define CAT( STR1,STR2 ) STR1##STR2
int main()
{
	printf("%s\n", CAT("aa","bb"));
	system("pause");
	return 0;
}</span>

 

           


       如有错误,欢迎指出,一起交流学习!




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值