简单认识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进行宏替换;