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. ##

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


#include
int main()
{
	printf ("file:%s\tline:%d\tdate:%s\ttime:%s\t%d\n",\
		__FILE__ ,__LINE__,__DATE__,__TIME__,__STDC__ );
	return 0;
}

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

              C编程之预处理标识符——__LINE__,__FILE__,__DATE__,__TIME__,__STDC__,#,##_第1张图片

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

            

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

       

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

#include
#include
#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;
}

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

 
  

           


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




你可能感兴趣的:(C)