目录
一、程序的编译和链接
二、预处理
1.预定义符号
2.#define定义宏
3.把一个宏参数变成对应的字符串(#参数)
4.#undef
5.条件编译
一、程序的编译和链接
组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人 的程序库,将其需要的函数也链接到程序中。
以上便是编译和链接的主要过程
下面为编译和链接的详细过程:
二、预处理
1.预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间 ..............等等
代码示例:
int main()
{
int i = 0;
printf("文件:%s i=%dn",__FILE__, i);//打印进行编译的源文件
printf("行号:%d i=%dn", __LINE__, i);//打印当前代码的行号
printf("日期:%s i=%dn", __DATE__, i);//打印文件被编译的日期
printf("时间:%s i=%dn", __TIME__, i);//打印文件被编译的时间
return 0;
}
2.#define定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义 宏(define macro)。
下面是宏的申明方式:
#define name(parament-list) stuff
其中name 是宏名, parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
注意:parament-list的左括号必须与name紧邻。
代码示例:
#define SQR(x) ((x)*(x))
int main()
{
int a = 4;
printf("%dn", SQR(a));
return 0;
}
输出结果为:
3.把一个宏参数变成对应的字符串(#参数)
当我们要实现 打印一个数等于多少时
int main()
{
int a = 10;
int b = 20;
printf("a = %dn", a);
printf("b = %dn", b);
return 0;
}
我们可以写一个宏来更简单的实现:
#define PRINT(N) printf(#N" = %dn",N)
int main()
{
int a = 10;
int b = 20;
//printf("a = %dn", a);
//printf("b = %dn", b);
PRINT(a);
PRINT(b);
return 0;
}
如果直接写成
#define PRINT(N) printf("N = %dn",N)
那么N将直接替换成参数的具体值,例如 PRINT(a),a等于10,那么宏将替换为
printf("10 = %dn",10),所以#N的作用为 将N直接替换为所传参数对应的字符串
例如 PRINT(a),相当于 printf("a"" = %dn",10)
4.#undef
这条指令用于移除一个宏定义。
使用示例:
移除之后,M显示报错
5.条件编译
常见的条件编译指令:
1.
#if 常量表达式 //... #endif
2.多个分支的条件编译
#if 常量表达式 //... #elif 常量表达式 //... #else //... #endif
3.判断是否被定义
#if defined(symbol) #ifdef symbol #if !defined(symbol) #ifndef symbol
#define M
int main()
{
#if defined(M)
printf("yesn");
#endif
//
#ifdef M
printf("yesn");
#endif
//
#if !defined(M)
printf("yesn");
#endif
#ifndef M
printf("yesn");
#endif
return 0;
}



