Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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_Compilation_C Preprocessor_Digraphs_Trigraphs - Fatal编程技术网

C 有向图是否由编译器转换,三向图是否由预处理器转换?

C 有向图是否由编译器转换,三向图是否由预处理器转换?,c,compilation,c-preprocessor,digraphs,trigraphs,C,Compilation,C Preprocessor,Digraphs,Trigraphs,我试图理解三角图和有向图,而不是使用它们 我已经阅读并理解: 在实际编译开始之前,应始终由预处理器将三角图转换为相应字符 编译器应将有向图转换为相应的字符 这是真的吗?有向图不会“转换为相应的字符”。字符串文字”有向图不会“转换为相应的字符”。在编译过程的第一阶段,字符串文字“三向图序列确实会被相应的字符替换,在预处理器之前,lexer分析字符流以生成预处理器标记 下一个阶段处理转义的换行符,即:\的实例紧接着一个换行符,该换行符从字符流中删除。请注意,\可以在第一阶段生成,作为??/tri

我试图理解三角图和有向图,而不是使用它们

我已经阅读并理解:

  • 在实际编译开始之前,应始终由预处理器将三角图转换为相应字符
  • 编译器应将有向图转换为相应的字符

这是真的吗?

有向图不会“转换为相应的字符”。字符串文字
”有向图不会“转换为相应的字符”。在编译过程的第一阶段,字符串文字
“三向图序列确实会被相应的字符替换,在预处理器之前,lexer分析字符流以生成预处理器标记

下一个阶段处理转义的换行符,即:
\
的实例紧接着一个换行符,该换行符从字符流中删除。请注意,
\
可以在第一阶段生成,作为
??/
trigraph的替代品


然后,词法分析器分析字符流以产生预处理标记,例如
[
,并且在编译过程的第一阶段,在预处理器词法分析器分析字符流以产生预处理器标记之前,
Trigraph序列确实被相应的字符替换

下一个阶段处理转义的换行符,即:
\
的实例紧接着一个换行符,该换行符从字符流中删除。请注意,
\
可以由第一阶段生成,以替换
??/
trigraph


lexer然后分析字符流以产生预处理标记,例如
[
第一阶段是词法分析。它是编译的一部分。@Pău Jău那么trigraph和digraph都发生在第一阶段编译之前?@Cătălinaîrbu我很高兴你找到了答案。-)第一阶段是词法分析。它是编译的一部分。@Pău Jău那么trigraph和digraph都发生在第一阶段编译之前@Cătălinaîrbu我很高兴你找到了答案。-)关于阶段顺序的有趣之处在于,行延续中的
\
最初可能被键入为
??/
,这进一步使用正则表达式分解C的尝试复杂化。幸运的是,C标准中这些神秘的角落进展缓慢但肯定被删除。@rici:我更新了答案以回应你的评论。关于阶段顺序的有趣之处在于,行继续符中的
\
最初可能被键入为
??/
,这进一步使用正则表达式分解C的尝试变得复杂。幸运的是,C标准中这些神秘的角落正在慢慢消失但肯定是被删除了。@rici:我更新了答案以回应你的评论。
chqrlie $ make lexing && ./lexing
clang -O3 -funsigned-char -std=c11 -Weverything -Wwrite-strings  -lm -o lexing lexing.c
lexing.c:8:14: warning: trigraph converted to '|' character [-Wtrigraphs]
    puts(STR(??!));
             ^
lexing.c:9:15: warning: trigraph converted to '|' character [-Wtrigraphs]
    puts(STR('??!'));
              ^
lexing.c:10:15: warning: trigraph converted to '|' character [-Wtrigraphs]
    puts(STR("??!"));
              ^
lexing.c:18:15: warning: trigraph converted to '\' character [-Wtrigraphs]
    puts(STR(<??/
              ^
4 warnings generated.
|
'|'
"|"
<:
'<:'
"<:"
<:
<:
'<:'
"<:"
glue(<,:)
<: