2

为什么严格遵守程序的ONor模式会产生不同的结果?严格遵守编写的原因,大多数现代工业编译器默认对自己的语言进行一些扩展,有的默认是C99等。OFFANSI C

#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
4

2 回答 2

2

"??=" is a trigraph. That's a very ancient idea to escape source code, if you can't enter in your terminal, what you want to enter.

"??=" is actual "#"

于 2014-02-20T20:34:59.187 回答
2

当它不处于 ansi 模式时gcc,不会将 trigrpah ??=长度 3)转换为#长度 1),这解释了长度差异。

如果您没有抑制警告gcc,则会警告它在非 ansi 模式下忽略三元组(现场查看):

警告:trigraph ??= 已忽略,使用 -trigraphs 启用 [-Wtrigraphs]

您可以在文档的选项控制 C 方言部分中阅读有关方言选项的更多信息。gcc它对以下内容说-ansi

[...] 它还启用了不受欢迎且很少使用的 ISO trigraph 功能。[...]

Trigraphs 包含在草案 C99 标准部分5.2.1.1 Trigraph 序列中,它说:

在任何其他处理发生之前,以下三个字符的序列之一(称为三字符序列12)的每次出现都被相应的单个字符替换。

以下序列包括:

??=   #
于 2014-02-20T20:33:16.863 回答