你的前提:
假设您正在使用 ISO 646 的不变集编写(可移植的)C99 代码。这意味着不能直接编写 \(反斜杠,反斜线,无论您如何命名)。
是有问题的。C99 定义了“源”和“执行”字符集,并要求两者都包括反斜杠字符的表示(C99 5.2.1)。对于您所描述的努力,我能想象的唯一原因是尝试生成在机器之间移动时不需要字符集转码的源代码。然而,在这种情况下,选择 ISO 646 作为通用基准是很奇怪的。与使用与 ISO-8859 系列字符集不一致的 ISO 646 变体相比,您更有可能遇到 EBCDIC 机器。(如果您可以假设 ISO 8859,那么反斜杠不会出现问题。)
不过,如果您坚持不使用文字反斜杠字符来编写 C 源代码,那么该字符的三元组就是这样做的方法。这就是发明三字母组的目的。在字符常量和字符串文字中,您不能以可移植的方式替换任何其他东西\n
或它的三元组等价物??/n
,因为它取决于实现该代码的映射方式。特别是,假设它映射到换行符是不安全的(但是,它包含在 ISO 646 的不变字符中)。
更新:
你具体问是否可以
在不使用三元组的情况下在字符串中包含 '\n' 字符(在函数中转换为换行符),或
不,这是不可能的,因为没有一个'\n'
角色。而且,这里似乎有点误解:\n
在一个字符或字符串中,字面量代表执行字符集中的一个字符。因此,编译器负责该转换,而不是 stdio 函数。stdio 函数的职责是通过编写旨在产生指定效果的字符或字符序列来处理输出中的该字符(“[m] 将活动位置移动到下一行的初始位置”)。
您还问是否可以
将换行符写入 FILE * 而不使用 '\n' 字符?
这取决于你的意思。如果你想写一个你知道执行字符集中代码的字符,那么你可以写一个具有该数值的数字常量。特别是,如果您想写入具有编码值的字符0xa
(在执行字符集中),那么您可以这样做。例如,您可以
fputc(0xa, my_file);
但这并不一定会产生等同于
fputc('\n', my_file);