Разрешено ли стандартом С++ использование нелатинских символов в директиве #error?
Например. Я хотел бы написать сообщение об ошибке на русском языке:
#error Сообщение об ошибке
int main() { }





Независимо от того, можете ли вы поместить символы, отличные от ASCII, в аргумент директивы #error, это «зависит от локали» в соответствии с C2011 5.2.1p1. Токены в строке после #error содержат символы, не входящие в исходный набор символов базовый; допустимы ли они как часть исходного набора символов расширенный, зависит от локали. В соответствии с приложение J.4 поведение, зависящее от локали, должно быть задокументировано, как и поведение, определяемое реализацией.
Разница между поведением, зависящим от локали, и поведением, определяемым реализацией, заключается в том, что может быть несколько локалей, каждая со своим собственным набором расширенных исходных символов. Возможно, только некоторые из этих расширенных исходных наборов символов включают кириллицу. Эти аспекты стандарта C в последний раз пересматривались в 1999 году, до того, как Unicode захватил мир, поэтому они беспокоятся о таких сценариях, как передача исходного файла, закодированного в ISO 8859-5, компилятору, который ожидает, что расширенные исходные символы будут соответствовать EUC. -JP.
Независимо от того, как вы на самом деле кодируете свои исходные файлы и соответствует ли это ожиданиям компилятора, то, что вы пытаетесь сделать, с большей вероятностью сработает, если вы используете строковый литерал в качестве аргумента #error:
#error "Сообщение об ошибке"
Это связано с тем, что некоторые компиляторы допускают более широкий набор символов в строковых литералах, чем в идентификаторах.