为什么严格遵守ON
计划的OFF
或ANSI C
模式会产生不同的结果?严格遵守大多数现代工业编译器默认为某种语言扩展的原因,有些默认是 C99 等。
#include <stdio.h>
#include <string.h>
int main (void)
{
int len;
len = strlen ("??=");
printf ("len=%d\n", len);
return 0;
}
结果如下。在两种情况下都提交了编译器选项-w
以禁止警告:
$ gcc t.c -w
$ ./a.out
len=3
$ gcc t.c -ansi -w
$ ./a.out
len=1
答案 0 :(得分:2)
当它不在ansi模式时gcc
没有将trigrpah ??=
(长度3 )转换为#
(长度1 )解释了长度差异。
如果您没有删除警告gcc
会警告它忽略非ansi模式中的trigraph( see it live ):
警告:trigraph ?? =忽略,使用-trigraphs启用[-Wtrigraphs]
您可以在gcc
文档的Options Controlling C Dialect部分详细了解有关方言选项的信息。它为-ansi
说明了以下内容:
[...]它还支持不受欢迎且很少使用的ISO三字符功能。 [...]
draft C99 standard部分5.2.1.1
Trigraph序列涵盖了三维图形,其中包含:
在进行任何其他处理之前,每次出现以下一种情况 三个字符的序列(称为三字母序列 12))被替换为相应的单个字符。
以下序列包括:
??= #
答案 1 :(得分:2)
"??="
是一个三角形。如果您无法进入您的终端,那么这是一个非常古老的想法来逃避源代码。
"??="
是实际"#"