CPP Info Memo (Part 1)

CPP Info Memo (Part 1)

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
    

    但从程序的可读性上来讲,上面的写法并不提倡。

posted @ 2011-10-28 13:47 英超 Views(...) Comments(...) Edit 收藏