转义 \t 的多字符常量警告

Multi character constant warning for escaped \t

如果我在尝试打印 "\t" 而不是实际制表符时写入 putchar('\t');,我会收到多字符常量警告。另一方面,如果我写 putchar('\'); 我不会收到任何警告。查看 ASCII table,没有字符 '\',只有 '\'。那么为什么没有警告呢?为什么 '\' 是一个字符,而 '\t' 是多个字符?反斜杠只能用于转义后面的一个字符吗?

不能用一次putchar调用打印\t,因为putchar一个 并且只有一个字符进入标准输出。使用 2:

putchar('\');
putchar('t');

另一种选择是使用 字符串 "\t"fputs:

fputs("\t", stdout);

'\' 没有警告,因为这是输入字符 \ 的字符文字的一种方式。在 ASCII 上,这与 '4''\x5c'.

同义

来自 C11 6.4.4.4 第 2 段和第 4 段:

2

An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in 'x'. [...] With a few exceptions detailed later, the elements of the sequence are any members of the source character set; they are mapped in an implementation-defined manner to members of the execution character set.

[...]

4

The double-quote " and question-mark ? are representable either by themselves or by the escape sequences \" and \?, respectively, but the single-quote ' and the backslash \ shall be represented, respectively, by the escape sequences \' and \.


您收到警告的原因是该行为完全由实现定义。在 C11 J.3.4 中,以下内容被列为实现定义的行为:

The value of an integer character constant containing more than one character or containing a character or escape sequence that does not map to a single-byte execution character (6.4.4.4).

由于 '\' 包含映射到单字节执行字符的转义序列 \,因此没有实现定义的陷阱,也没有什么值得警告的;但是 \t 包含 2 个字符:\t,并且它不会执行您想要的可移植操作。

\是一个字,t是一个字,分明是两个字。

\是一个转义序列,就像\t一样;这意味着 \.

如果你想打印两个字符 \t,你显然需要两次调用 putch() 或一个接受 string 参数 "\t".

https://en.wikipedia.org/wiki/Escape_sequences_in_C#Table_of_escape_sequences