c - 为什么 GCC 在使用三字母时发出警告,而在使用二字母时却不发出警告?

标签 c gcc compiler-warnings digraphs trigraphs

代码:

#include <stdio.h>

int main(void)
{
  ??< puts("Hello Folks!"); ??>
}

上述程序在使用 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]

但是当我将 main 的主体更改为:

<% puts("Hello Folks!"); %>

不会抛出任何警告。

那么,为什么编译器在使用三字母时警告我,而在使用二字母时却不警告我?

最佳答案

因为三字母组具有悄悄更改代码的不良影响。这意味着同一个源文件在有和没有三字母替换的情况下都是有效的,但会导致不同代码。这在字符串文字中尤其成问题,例如 "<em>What??</em>" .

语言设计和语言进化应该努力避免无声的改变。让编译器警告三字母是一件好事。

将此与二合字母进行对比,二合字母是新标记,不会导致无声变化。

关于c - 为什么 GCC 在使用三字母时发出警告,而在使用二字母时却不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167102/

相关文章:

gcc - 如何获得错误字符串格式的警告(C++)

java未经检查的转换

将指针强制转换为仿函数,然后调用它

c - "The Linux Programming Interface"中对错误处理函数的 undefined reference

c - 重新定义;不同的基本类型

c - Visual Studio - fatal error C1057

c++ - 无法将 '(<expression error>)' 从 '<brace-enclosed initializer list>' 转换为 std::unique_ptr<int []>

gcc - 我如何知道每个 gcc 版本附带的 libstdc++?

c - 尝试了解 GCC 和 Windows 的主要功能

c# - 引用类型参数的编译器警告 CS1723 "XML comment has cref attribute ' T' 是什么意思?