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

来源:互联网 发布:如何获取股票交易数据 编辑:程序博客网 时间:2024/05/16 08:55

常用的预定义符号:

    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##STR2int main(){printf("%s\n", CAT("aa","bb"));system("pause");return 0;}</span>


           


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




0 0
原创粉丝点击