C程序的编译阶段是什么?

C标准编译阶段是否由标准规定?

如果是,那是什么?

如果没有,广泛使用的编译器(我更喜欢MSVS)的答案将是巨大的。

我在谈论预处理,标记化,解析等。他们执行的顺序是什么,特别是做什么?

编辑:我知道什么是编译,链接和预处理,我主要对其他人和订单感兴趣。对这些的解释当然也受到欢迎,因为我可能不是唯一一个对答案感兴趣的人。

Are the stages of compilation of a C++ program specified by the standard?

是和否

C标准定义了9个“翻译阶段”。报价从the N3242 draft(10MB PDF),日期为2011-02-28(在官方C11标准发布之前),第2.2节:

The precedence among the syntax rules of translation is specified by the following phases [see footnote].

  1. Physical source file characters are mapped, in an implementation-defined manner, to the basic source character set
    (introducing new-line characters for end-of-line indicators) if
    necessary. [SNIP]
  2. Each instance of a backslash character (\) immediately followed by a new-line character is deleted, splicing physical source lines to
    form logical source lines. [SNIP]
  3. The source file is decomposed into preprocessing tokens (2.5) and sequences of white-space characters (including comments). [SNIP]
  4. Preprocessing directives are executed, macro invocations are expanded, and _Pragma unary operator expressions are executed. [SNIP]
  5. Each source character set member in a character literal or a string literal, as well as each escape sequence and universal-character-name
    in a character literal or a non-raw string literal, is converted to
    the corresponding member of the execution character set; [SNIP]
  6. Adjacent string literal tokens are concatenated.
  7. White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. (2.7). The
    resulting tokens are syntactically and semantically analyzed and
    translated as a translation unit. [SNIP]
  8. Translated translation units and instantiation units are combined as follows: [SNIP]
  9. All external entity references are resolved. Library components are linked to satisfy external references to entities not defined in the
    current translation. All such translator output is collected into a
    program image which contains information needed for execution in its
    execution environment.

[footnote] Implementations must behave as if these separate phases occur, although in practice different phases might be folded together.

如[SNIP]标记所示,我没有引用整个部分,只是足以让想法跨越。

要强调,编译器不需要遵循这个确切的模型,只要最终的结果就好像他们一样。

阶段1-6或多或少对应于预处理器,7对应于通常可以将其视为编译,8处理模板,9对应于链接。

(C的翻译阶段是相似的,但省略#8)

翻译自:https://stackoverflow.com/questions/8833524/what-are-the-stages-of-compilation-of-a-c-program

转载注明原文:C程序的编译阶段是什么?