预编译命令
在C语言的预处理命令中,这些命令可以将别的源码内容插入到直指定的位置,可以标识出只有在特定的条件下才会被编译某一段的程序代码;可以配合定义类似标识符功能的宏定义,在编译时,预处理就会用别的文本来代替这个宏,来决定是否编译本段内容的代码,这种做法可以避免项目开发过程中,模块越来越多造成的代码量越来远大,从而导致代码量大,编译慢,甚至超出MCU的内存。
每个预处理命令均为独占一行,以#字符作为开头(头文件),并且只有空制表符(Tab)和空格符(space)才能出现在#号前面,接下来将几个常用到的命令。
1,嵌套的#include命令
在大型复杂的工程中,通常会将功能模块和层次分得特别清晰,也就是说一个应用层的实现文件可能依赖数几十个头文件才能完成,但是在一些接口层的实现过程中,通常会依赖大量可重复使用的数据类型转换工具接口,这种工具类的接口通常最容易被重复包含,可能来自同级的接口间同时包含,然后被某个应用层一起包含,或者应用层开发者不了解情况下直接将已经在接口层中包含过的工具接口,再次重复包含,这样在编译过程中是肯定会报出重复编译的。这个问题通常不难解决,删除掉重复包含的地方即可,但是需要一层一层的逐个文件筛选,比较占用开发时间。然而可以通过采用条件编译命令,方便多次包含相同的文件!
例如:
#ifndef INCFILE_H_
#define INCFILE_H_
/*
/*
#endif /* INCFILE_H_ */
2,#progma命令
最新的GNU C编译器和微软Visual C编译器都支持#progma pack(n),它使得编译器让结构成员对齐到特定的字节边界。
例字:
#if defined(_GNUC_) || define(_MSC_VER)
#progma pack(1) //对其字节,没有填充
#endif
其他:
#progma pack(2) //把结构成员对其到偶数地址
#progma pack(4) //把结构成员对其到4的倍数地址
其他关于系统多线程内容,需要结合系统平台说明吧,主要关注创建启动线程/线程共享数据/互斥/线程通信等等。