#error 指令中是否允许使用非拉丁字符?

Are non-Latin characters allowed in #error directive?

C++ 标准允许在 #error 指令中使用非拉丁字符吗?

例如我想用俄语写一条错误消息:

#error Сообщение об ошибке
int main() { }

根据 C2011 5.2.1p1. The tokens on the line after #error contain characters that are not part of the basic source character set; whether or not they are valid as part of the extended source character set is locale-specific. Per annex J.4,是否可以将非 ASCII 字符放入 #error 指令的参数是 "locale-specific",需要记录特定于语言环境的行为,就像实现定义的行为。

特定于语言环境的行为和实现定义的行为之间的区别在于,可能有多个语言环境,每个语言环境都有自己的一组扩展源字符。也许只有一些扩展的源字符集包括西里尔字符。 C 标准的这些方面最后一次修订是在 1999 年,在 Unicode 接管世界之前,因此他们担心将以 ISO 8859-5 编码的源文件提供给期望扩展源字符符合 EUC 的编译器等场景-JP.

无论您实际如何编码源文件以及它是否符合编译器的预期,如果您使用字符串文字作为 #error 的参数,您尝试做的事情更有可能起作用:

#error "Сообщение об ошибке"

这是因为一些编译器允许在字符串文字中使用比标识符中更多的字符。