Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的预处理器命令是否算作标记?_C_C Preprocessor_Token - Fatal编程技术网

C中的预处理器命令是否算作标记?

C中的预处理器命令是否算作标记?,c,c-preprocessor,token,C,C Preprocessor,Token,我在读关于代币和计算程序中代币的数量 之前我在某个地方读到过,预处理器命令不算作标记。 但当我读到关于它上面的标记时,在“特殊符号”一节中给出了: 预处理器(#):预处理器是一个宏处理器,编译器会自动使用它在实际编译之前转换程序 所以我很困惑,在一个程序中,如果我们写#define,它会是一个令牌吗 例如: #include<stdio.h> #define max 100 int main() { printf("max is %d", max); ret

我在读关于代币和计算程序中代币的数量

之前我在某个地方读到过,预处理器命令不算作标记。 但当我读到关于它上面的标记时,在“特殊符号”一节中给出了:

预处理器(#):预处理器是一个宏处理器,编译器会自动使用它在实际编译之前转换程序

所以我很困惑,在一个程序中,如果我们写
#define
,它会是一个令牌吗

例如:

#include<stdio.h> 
#define max 100 
int main() 
{ 
    printf("max is %d", max); 
    return 0; 
} 
#包括
#定义最大值100
int main()
{ 
printf(“最大值为%d”,最大值);
返回0;
} 

本例中有多少标记?

链接的文章充满了基本错误,不应依赖这些错误

解析C或C++的过程定义为一系列转换:1

  • 反斜杠换行符被替换为任何内容,甚至连空格都没有
  • 注释将被删除并替换为单个空格
  • 幸存的文本被转换成一系列预处理标记。这些标记不如语言本身使用的标记具体:例如,关键字
    if
    是语言本身的if标记,但只是预处理器的IDENT标记
  • 执行预处理指令并展开宏
  • 每个预处理令牌都转换为一个令牌
  • 令牌流被解析成一个抽象语法树,编译器的其余部分从中获取它
  • 您的示例程序

    #include<stdio.h> 
    #define max 100 
    int main() 
    { 
        printf("max is %d", max); 
        return 0; 
    }
    
    其中“n”是许多来自stdio.h的代币

    预处理指令(
    #include
    #define
    #if
    ,等等)总是从令牌流中删除,并且可能会被其他指令替换,因此在转换6之后,您永远不会有直接来自指令行文本的令牌。但是您通常会有由每个指令的效果产生的标记,例如
    stdio.h
    的内容和
    DECIMAL-INTEGER:100
    替换
    IDENT:max

    最后,C和C++几乎是这样操作的,但不是完全相同,规格是形式上独立的。您通常可以依靠预处理操作在两种语言中表现相同,只要您只使用预处理器做简单的事情,这是当今的最佳实践



    1,有时你会看到人们在谈论翻译阶段,这是C和C++标准正式描述这一系列操作的方式。我的清单不是翻译阶段的清单;它包括一些按标准分组为单个阶段的内容的单独要点,并省略了与本讨论无关的几个步骤。

    没有c/c++语言。有效令牌是什么意思?关键词?极客换极客的文章充满了可疑的解释。我会忽略这篇文章。上一次我看到C++语法预处理器令牌和令牌是不同的,预处理器令牌不会算作令牌。我的意思是,这是不是简单的记数?请指定该程序中有多少令牌,以便我可以获得更好的性能knowledge@john“#”和“include”都是预处理器令牌。语言中唯一没有用某种标记定义的方面是注释、反斜杠换行符和三角图。
    PUNCT:# IDENT:include INCLUDE-ARG:<stdio.h>
    PUNCT:# IDENT:define IDENT:max PP-NUMBER:100
    IDENT:int IDENT:main PUNCT:( PUNCT:)
    PUNCT:{
    IDENT:printf PUNCT:( STRING:"max is %d" PUNCT:, IDENT:max PUNCT:) PUNCT:;
    IDENT:return PP-NUMBER:0 PUNCT:;
    PUNCT:}
    
    [ ... some large volume of tokens produced from the contents of stdio.h ... ]
    INT IDENT:main LPAREN RPAREN
    LBRACE
    IDENT:printf LPAREN STRING:"max is %d" COMMA DECIMAL-INTEGER:100 RPAREN SEMICOLON
    RETURN DECIMAL-INTEGER:0 SEMICOLON
    RBRACE