2012-06-17 20 views

回答

4

甲预处理标记是预处理器的语法的元素。从[lex.pptoken]在C++标准:

预处理令牌

  • 标题名
  • 标识符
  • PP-数
  • character-literal
  • 用户定义字符的字面
  • 字串文本
  • 用户定义-字串文本
  • 预处理-OP-或-PUNC
  • 每个非 - 不能是上述之一的空白字符

...

甲预处理标记是3至6

在转换阶段的语言的最小词法元件所以“转换到预处理标记”是词法翻译单元和识别的过程个人令牌。

C++令牌(真的只是“令牌”)列在[lex。令牌]:

令牌

  • 标识符
  • 关键字
  • 字面
  • 操作者
  • 标点符号

所有其他的转换阶段时有发生(宏扩展等)之后,这些只存在。

有关整个过程的更多信息,我建议阅读C++标准中的[lex.phases]。

2

更简单的解释。

而且,您可能知道,许多编译器都有一个词法分析过程,其中源代码被分割为令牌。

此源代码:

void main() 
{ 
    int x = -3 - -5; 
    printf("Hello World"); 
} // void main() 

是变身为类似于这样:

 
+--------------+------------------+ 
| TOKEN  | TEXT   | 
+--------------+------------------+ 
| void  | "void"   | 
+--------------+------------------+ 
| identifier | "main"   | 
+--------------+------------------+ 
| leftcurly | "{"    | 
+--------------+------------------+ 
| identifier | "int"   | 
+--------------+------------------+ 
| identifier | "x"    | 
+--------------+------------------+ 
| assign  | "="    | 
+--------------+------------------+ 
| minus  | "-"    | 
+--------------+------------------+ 
| integer  | "3"    | 
+--------------+------------------+ 
| minus  | "-"    | 
+--------------+------------------+ 
| minus  | "-"    | 
+--------------+------------------+ 
| integer  | "5"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| identifier | "printf"   | 
+--------------+------------------+ 
| leftpar  | "("    | 
+--------------+------------------+ 
| string  | "Hello World" | 
+--------------+------------------+ 
| rightpar | ")"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| rightcurly | "}"    | 
+--------------+------------------+ 
| comment  | "// void main()" | 
+--------------+------------------+ 

每件这种所谓的 “令牌” 的文字,都具有意义。


有时,在编译过程中的其它部分,该令牌可以被替换,由anothers令牌:

 
+--------------+------------------+ 
| TOKEN  | TEXT   | 
+--------------+------------------+ 
| void  | "void"   | 
+--------------+------------------+ 
| functiondec | "main"   | 
+--------------+------------------+ 
| leftcurly | "{"    | 
+--------------+------------------+ 
| type  | "int"   | 
+--------------+------------------+ 
| variabledec | "x"    | 
+--------------+------------------+ 
| assign  | "="    | 
+--------------+------------------+ 
| negative | "-"    | 
+--------------+------------------+ 
| integer  | "3"    | 
+--------------+------------------+ 
| substract | "-"    | 
+--------------+------------------+ 
| negative | "-"    | 
+--------------+------------------+ 
| integer  | "5"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| functioncall | "printf"   | 
+--------------+------------------+ 
| leftpar  | "("    | 
+--------------+------------------+ 
| string  | "Hello World" | 
+--------------+------------------+ 
| rightpar | ")"    | 
+--------------+------------------+ 
| semicolon | ";"    | 
+--------------+------------------+ 
| rightcurly | "}"    | 
+--------------+------------------+ 
| comment  | "// void main()" | 
+--------------+------------------+ 

从 “负” 标记,以,无论是“负的转化签名令牌“,&”减法令牌“,是这个”预处理令牌“到”最终令牌“的非常好的例子。

这是一个非常概念性的解释。您可能想要阅读有关您的特定编译器文档的更详细的技术信息。

干杯

+0

感谢您的支持。我会期待一些预处理器的例子,但这也很棒。 – unj2

相关问题