概述
预处理器是一种不依赖于c语言的语法,它有独自的书写规范。处理预处理器的内容是编译c文件的第二部(第一步是清除注释)。
预处理器不会产生可执行的代码,而是做一个文字替换。因此原则上c预处理器也可以被其他语言作为预处理器使用。
c预处理器有它独立的语法:
- 每条命令的结尾不用以封号“;”结尾
- 一条命令换行前需要在前一行的最后一个字符后加上反斜杠’\’
- 很多命令都以井号’#'开头,井号后可以跟上任意数量的空格
预处理命令可以分为以下几类:
- include命令
- 类对象宏
- 类函数宏
- 条件翻译
- 其它
include命令
与文字代替一样,表达式’#include <….>'将被文件中的内容代替。
语法:
#include <h‐char‐sequence >
#include “y‐char‐sequence”
#include preprocessor‐Tokens //Standard‐C
搜索路径:
- "y‐char‐sequence"的搜索路径是在当前工作目录下,y‐char‐sequence可以使用相对路径也可以使用绝对路径
#include "test.h"
#include "verzeichnis/hallo.h"
#include "c:\user\xyz\test.h"
#include "../lib/test.h"
注:绝对路径中在windows系统中路径分隔符是’’, linux是’/’。
- <h‐char‐sequence>的搜索路径是再编译器预先设定的目录下。可以通过相对路径引入
#include <stdio.h>
#include <sys/stat.h>
注:
- 同一文件只允许定义一次
- 当相同的头文件定义了两次, 一个变量或者一个函数就会被定义两次,这回导致编译器报错
- 如果H文件包含在多个C文件中,那么在每个C文件中都会创建一个独立的变量/函数,所以之后链接器会因为重复命名而放弃链接操作。 因此,头文件中不允许有任何定义。
- 允许任意数量的声明
include 保护:include语句可以任意嵌套,因此一个H文件可以被包含多次。一方面,这可能导致无限递归,另一方面,也不允许对常量进行多次声明。为了避免多重包含,应该在每个头文件中手动建立一个包含防护:
#ifndef _Projektname_Dateiname_Dateiendung_INCLUDED_
#define _Projektname_Dateiname_Dateiendung_INCLUDED_
//Inhalt
#endif
类对象宏
语法: #define name sequence‐of‐tokens
对应于文本替换,在下面的代码中,name被sequence‐of‐tokens所替换。在注释和字符串中不发生文本替换。像变量和函数名一样,宏不能被定义两次。然而,可以用#undef删除以前定义的宏,这样就可以用#define进行新的分配。
#include <stdio.h>
#include <string.h>
#define ROT1 5
#define ROT2
# define ROT3 8 //Leerzeichen werden Eleminiert
#define ROT4 /*Test */ "hello world\n"
int main(int argc, char const *argv[])
{
#define ROT5 5
int a, b;
a = ROT5;
b = ROT5 + 6;
printf("%d\n", a);
printf(ROT4);
#define ROT6 1, "hallo", 7
char str[] = "ROT6";
struct
{
int a;
char str[7];
int b;