具有严格符合ANSI C的ON / OFF模式的不同结果

时间:2014-02-20 20:30:03

标签: c gcc ansi trigraphs

为什么严格遵守ON计划的OFFANSI 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

2 个答案:

答案 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)

"??="是一个三角形。如果您无法进入您的终端,那么这是一个非常古老的想法来逃避源代码。

"??="是实际"#"