为什么GCC在使用三字符时会发出警告,但在使用有向图时则不会?

Spi*_*rix 6 c gcc compiler-warnings digraphs trigraphs

码:

#include <stdio.h>

int main(void)
{
  ??< puts("Hello Folks!"); ??>
}
Run Code Online (Sandbox Code Playgroud)

上述程序,当使用GCC 4.8.1编译-Wall-std=c11,给出了以下警告:

source_file.c: In function ‘main’:
source_file.c:8:5: warning: trigraph ??< converted to { [-Wtrigraphs]
     ??< puts("Hello Folks!"); ??>
 ^
source_file.c:8:30: warning: trigraph ??> converted to } [-Wtrigraphs]
Run Code Online (Sandbox Code Playgroud)

但当我改变身体时main:

<% puts("Hello Folks!"); %>
Run Code Online (Sandbox Code Playgroud)

没有警告被抛出.

那么,为什么编译器在使用三字符时会发出警告,但在使用有向图时却没有?

Sha*_*our 5

这个关于预处理的gcc文档为警告提供了一个非常好的理由(强调我的):

Trigraphs不受欢迎,许多编译器错误地实现它们.可移植代码不应该依赖于转换或忽略的三字母.使用-Wtrigraphs GCC会在三角形可能会改变程序的含义时发出警告.

并且在这个关于Tokenization的 gcc文档解释了digraphs不像trigraphs没有潜在的负面影响(强调我的):

还有六个有向图,C++标准称之为替代令牌,它们只是拼写其他标点符号的替代方法.这是第二次尝试解决过时系统中缺少标点符号的问题.与trigraphs不同,它没有负面的副作用,


Jen*_*ens 5

因为三字母具有静默改变代码的不良影响.这意味着相同的源文件在有和没有三角形替换的情况下都有效,但会导致不同的代码.这在字符串文字中尤其成问题"<em>What??</em>".

语言设计和语言演变应努力避免无声的变化.让编译器警告三字符是一件好事.

将此与有向图相比较,有向图是不会导致无声变化的新标记.