CPP Info Memo (Part 1)
Table of Contents
1 Overview
1.1 Initial Processing
1.1.1 End Of Line (EOL)
GCC 能够识别的 EOL 包括 ASCII 码中的 LF, CR LF 和 CR , 也就是传说中的 "\n" "\r\n" 和 "\r"。
换句话说,即便在 Linux 下去编译 Windows 或者老的 Mac OS 下写的代码, 也完全没有问题。但是,无论采用哪中 EOL , EOL 在整个文件中应该保持一致, 否则 GCC 可能无法处理行号。
此外,如果文件的结尾没有换行符, GCC 会认为最后一个 EOL 由 EOF 来提供, 但标准 C 中规定,该情形会触发未知的行为(undefined behaviour), 所以 GCC 会在这种情况下给出一个 Warning 。
1.1.2 Continued lines
"\" 用来折行,但 "\" 后面可以接若干 Whitespace ,这些 Whitespace 将会被忽略。 "\" 后面的 WS 经常是拼写时候不小心弄上去的,所以 GCC 会对此给出警告。
1.1.3 Comments
- 1注释在预编译阶段被替换成 Whitespace,注释无嵌套, Block comments 和 Line Comments 都是如此。
一般来讲,从编译器的角度来看,将两者混杂在一起也无不可。如:
/* block comment // contains line comment yet more comment */ outside comment // line comment /* contains block comment */
- 2但要注意,不要把 block comments 的尾部从注释中给剥离出来,形如:
// l.c. /* block comment begins oops! this isn't a comment anymore */
- 3 String 中的 "\/*" 和 "*/" 不会被看成注释。
- 4 此外, 在 C89 中,没有 Line comment 这个东东,他是在 C99 后才加到标准中的, 也就是说,如果我们用的编译器很老,那么有可能不支持 "//" 这种注释。
- 5最后一点, 预处理是在程序编译的最早阶段执行的,所以即便是下面的这种古怪的写法,实际上也是合法的:
/\ * */ # /**/ defi\ ne FO\ O 10\ 20
它实际上等同于:
#define F00 1020
但从程序的可读性上来讲,上面的写法并不提倡。