常用的预定义符号:
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>
如有错误,欢迎指出,一起交流学习!