程序执行的几个步骤:
1.预处理:
①将头文件展开
②宏替换
③条件编译
④去掉注释
2.编译:
①语义语法纠错
②将.c文件编译成汇编语言
3.汇编:将汇编语言变成二进制机器语言
4.链接:将所有的目标文件和依赖的库文件进行汇总,得到最终的可执行程序 以下开发工程中经常用到的部分预处理指令:
#define <#macro#> // 定义宏
#undef <#macro#> // 取消宏
#if <#condition#> // 如果给定的condition为真,则编译下面的代码
#ifdef <#macro#> // 如果宏已定义,则编译下面的代码
#ifndef <#macro#> // 如果宏没有被定义,则编译下面的代码
#elif <#condition#> 如果前面的#if给定条件为假,当前的条件为真,则编译下面的代码
#endif // 结束一个#if…#else条件编译块
#error <#message#> // 停止编译并显示错误信息
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏。
步骤: ①在调用宏时,首先对参数进行检查,看看是否包含了任何由#define定义的符号。如果是它们首先被替换。 ②替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替代。 ③最后,再次对文本结果进行扫描,看看是否包含了任何由#define定义的符号。如果是就重复上述处理过程。 这样,宏定义参数和#define定义可以包含其他#define定义的符号。但是,宏不可以出现递归。 例如:
#define PRINT(Val) printf(#Val " = %d\n", Val)
//期望打印的值是:
//10+20 = 30
PRINT(10+20);
//相当于
printf("10+20" " = %d\n", 10 + 20);
在定义宏时,经常会出现的两个运算符 # 和 ##
#:出现在宏定义中的#运算符,会将其后面参数转化为一个字符串。我们把这种用法的成为字符串化运算符。 ##:常用于把多个参数连接在一起。
1、#if 指令用于检测后面的常量表达式,如果为真,则编译接下来的代码,直到出现 #else、#elif、#endif为止;否则就不编译。
2、#endif 指令用于终止#if预处理指令。
// 由于定义的AXE_TAG宏代表0,#if条件为假,不编译后面的代码,直到#endif,最后只输出
BB。去掉 #define AXE_TAG 0语句,效果也是一样的。
#if AXE_TAG
printf("AA\n");
#endif
printf("BB\n");
}
return 0;
}
3、#ifdef和#ifndef
#define _FBI_WARNING_
int main(int argc, const char * argv[]) {
#ifdef _FBI_WARNING_
printf("YES\n");
#endif
#ifndef _FBI_WARNING_
printf("NO\n");
#endif
/*等价于*/
#if defined(_FBI_WARNING_)
printf("YES\n");
#endif
#if !defined(_FBI_WARNING_)
printf("NO\n");
#endif
}
return 0;
}
4、#else指令
#define _FBI_WARNING_
int main(int argc, const char * argv[]) {
#ifdef _FBI_WARNING_
printf("YES\n");
#else
printf("NO\n");
#endif
}
return 0;
}
5、#elif指令 #elif预处理指令综合了#if和#else指令的作用
#define _FBI_WARNING_
int main(int argc, const char * argv[]) {
#ifdef _FBI_WARNING_
printf("YES\n");
#elif FBI_WARNING
printf("Unknown\n");
#else
printf("NO\n");
#endif
}
return 0;
}
①#include指令使另外一个文件被编译:预处理器先删除这条指令,并用包含文件的内容替换。这样一个文件被包含10次,那就实际被编译10次。 ②库文件一般用 < > 包含;本地文件一般用 “ ” 包含。 ③文件开头写:#pragma once 可以避免头文件的重复引入。 以上总结,有不足和有误的地方还望指出!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有