(1)__FILE__ :表示进行编译的源文件名
(2)__LINE__ :表示文件当前行的行号
(3)__DATE__ :表示文件被编译的日期
(4)__TIME__ :表示文件被编译的时间
(5)__STDC__:表示若编译器遵循ANSI C,其值为1,否则未定义
用处:__LINE__和__FILE__用于在确认调试输出来源方面,__DATE__和__TIME__用于在被编译的程序中加入版本信息,__STDC__用于在ANSI和非ANSI环境都必须进行编
译的程序中结合条件编译:
#include <stdio.h>
int main()
{
printf("file:%s\n line:%d\n date:%s\n time:%s\n"
,__FILE__,__LINE__,__DATE__,__TIME__);
return 0;
}
2.#:预处理器把 #宏参数(#argument)这种结构翻译为"argument"
#include <stdio.h>
#define M 10
#define PRINTF(FORMAT,VALUE)\
printf("the value of " #VALUE " is "FORMAT "\n",VALUE)
int main()
{
PRINTF("%d",M);
return 0;
}
3.##: 对于这种两个#的结构,预处理器把它两边的符号连接成一个符号
4.关于宏和函数的区别。
总的来说,宏和函数的目的都是集中地实现某个特定的功能,但是二者有一些区别:
(1) 函数:函数代码只出现于一个固定的地方,程序每次使用这个函数时,都调用那个地方的同一份代码;所以函数存在调用、返回的额外开销;但是函数参数只在函数调用
时求值一次,它的结果值传递给函数,表达式的求值结果更加容易预测,并且参数的副作用不会造成任何特殊问题;此外,函数的参数是与类型有关的,若参数类型不同就需要
使用不同的函数,即使它们的任务相同
(2) 宏:程序每次使用宏时,宏代码都被插入到程序内部,除了非常小的宏之外,程序长度大幅度增长;无需调用返回相比函数宏速度更快;宏参数求值是在所以周围表达式
的上下文环境,如果不加圆括号,邻近操作符的优先级会产生不可预期的结果;参数每次用于宏定义时,都会重新求值,则具有副作用的参数会产生不好的后果;另外,宏与类
型无关,只要参赛的操作合法,它可以使用任何参数类型
总的来说,代码比较长的程序,可以用函数实现的就不用宏来实现
5.关于编译链接的整个过程和详细的每个过程
总体来说,一个c程序从产生到实现要经过以下过程:
但是真正的编译系统其实会做2件事情:编译、链接.
(1)编译:又分为编译 和 汇编两个过程
<1>编译:.c源程序---汇编语言的过程
<2>汇编:汇编语言到.obj目标文件(二进制文件)的过程
这里的目标文件已经是二进制文件了,在编译过程中,如果编译器发现.c的源代码有错误就会报错,这时程序员重新检查.c源程序;若.c源文件通过编译,就会生成.obj目标
文件(根据平台不同,.obj扩展名不同,windows下是.obj文件;linux下是.o文件),无论如何通过编译后的目标文件是二进制文件
(2)链接:把.obj的目标文件链接成.exe可执行文件