1.程序的翻译环境和执行环境:
在ANSI C的任何一种实现中,存在两个不同的环境
1.翻译环境:源代码被转换为可执行的机器指令
2.执行环境:用于实际执行代码
.c(源文件)经过编译器生成.obj(目标文件)
2.预处理详解:
2.1预定义符号:
__FILE__ | 进行编译的源文件 |
__LINE__ | 文件当前的行号 |
__DATE__ | 文件被编译的日期 |
__TIME__ | 文件被编译的时间 |
__STDC__ | 如果编译器遵循ANSI C其值为1,否则未定义 |
注:__是由两个下划线"_"构成
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("file: %s line=%d date:%s time:%s i=%d\n",__FILE__,__LINE__,__DATE__,__TIME__, i);
}
return 0;
}
#define 定义标识符后面不需要加分号
#define 定义宏:
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(#define macro)。
宏的声明方式:
#define name( parament-list ) stuff
注意:参数列表的左括号必须跟 name 紧邻。
#和##的作用:
#define PRINT(N) printf("the value of "#N" is %d\n",N)//#N 相当于是替换成"a"
int main()
{
//printf("hello world\n");
//printf("hello ""world\n");//打印出来结果一样
int a = 10;
PRINT(a);
return 0;
}
#define CAT(class,num) class##num //将两个字符串合并成一个
int main()
{
int class120 = 100;
printf("%d\n", CAT(class, 120));
return 0;
}
#undef:
用于移出一个宏定义
#define M 100
int main()
{
printf("%d\n", M);
#undef M
printf("%d\n", M);//未定义标识符
return 0;
}
条件编译:
在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。(在某些条件下编译,条件满足就编译,条件不满足就不编译,编译器会在预处理阶段进行取舍)
常见的条件编译指令:
1.
#if 常量表达式
...
#endif
例如:
int main()
{
#if 0
printf("hehe\n");//表达式为假则不编译
#endif
return 0;
}
2.
#if 常量表达式
//...
#elif 常量表达式
//...
#else
//....
#endif
3.判断是否被重定义
#define MAX 100
#ifndef MAX//如果未被定义表达式则为真,执行后续内容
int main()
{
printf("hehe\n");
return 0;
}
#endif
头文件被包含的方式:
<>和" "的区别是查找策略的不同
<>查找策略:直接去库目录下查找
" "查找策略:首先在代码路径下查找,如果查找不到则在库目录下查找