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)
没有警告被抛出.
那么,为什么编译器在使用三字符时会发出警告,但在使用有向图时却没有?
这个关于预处理的gcc文档为警告提供了一个非常好的理由(强调我的):
Trigraphs不受欢迎,许多编译器错误地实现它们.可移植代码不应该依赖于转换或忽略的三字母.使用-Wtrigraphs GCC会在三角形可能会改变程序的含义时发出警告.
并且在这个关于Tokenization的 gcc文档中解释了digraphs不像trigraphs没有潜在的负面影响(强调我的):
还有六个有向图,C++标准称之为替代令牌,它们只是拼写其他标点符号的替代方法.这是第二次尝试解决过时系统中缺少标点符号的问题.与trigraphs不同,它没有负面的副作用,
因为三字母具有静默改变代码的不良影响.这意味着相同的源文件在有和没有三角形替换的情况下都有效,但会导致不同的代码.这在字符串文字中尤其成问题"<em>What??</em>".
语言设计和语言演变应努力避免无声的变化.让编译器警告三字符是一件好事.
将此与有向图相比较,有向图是不会导致无声变化的新标记.