Можем ли мы заменить кавычки другими символами на c? - PullRequest
0 голосов
/ 10 июня 2019

Я делаю немного раздражающий заголовок C, заменяя имена функций, номера и т. Д. На корейский, используя макрос. как это

#pragma once
#include <stdio.h>
#define 인트 int
#define 롱 long
#define 영 0
//and more and more

И я хотел сделать то же самое, чтобы заключить в кавычки, но это не сработало. мой код был

#define some_korean "

когда я скомпилировал свою программу с этим кодом, я получил ошибку C2001
https://docs.microsoft.com/cpp/error-messages/compiler-errors-1/compiler-error-c2001?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DKO-KR%26k%3Dk(C2001)%26rd%3Dtrue&view=vs-2019 Есть ли способ заменить qoute метки в C с помощью макросов или даже без макросов?

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Как указано в C 2018 5.1.1.2 1, перевод C происходит в 8 этапов, упрощенно здесь:

  1. Символы в исходном файле отображаются в исходный набор символов в соответствии с реализацией.
  2. Если обратные косые черты обозначают непрерывные линии, линии соединяются вместе.
  3. Исходный файл сгруппирован в токены предварительной обработки и последовательности пробелов.
  4. Выполнены директивы предварительной обработки.
  5. Символы в символьных константах и ​​строковых литералах преобразуются из исходного набора символов в набор символов выполнения.
  6. Смежные строковые литералы объединяются.
  7. Токены предварительной обработки преобразуются в токены и анализируются синтаксически и семантически.
  8. Разрешены ссылки на внешние объекты и функции.

Проблема, с которой вы сталкиваетесь, заключается в основном в фазе 3. Замена макроса не работает на основе текста или символа; он заменяет токены предварительной обработки, а не символы. Таким образом, вы не можете заменить «some_korean» на кавычку. Даже если «some_korean» распознается как токен предварительной обработки, кавычка - нет, и поэтому он не может быть токеном предварительной обработки в данных замены макроса.

Кроме того, какие строки вы можете обозначить как «some_korean», может быть проблематично. Чтобы служить именем макроса, это должен быть идентификатор в грамматике. Идентификатором является идентификатор-нецифровый символ, за которым следует любое количество либо идентификатор-нецифровый или цифра символов (которые являются от «0» до «9»). идентификатор без цифры - это без цифры (подчеркивание, от «a» до «z» или от «A» до «Z»), имя универсального символа (более подробно описано в Приложении D к стандарту C) или любые символы, определяемые реализацией для этой цели.

Корейские символы, по-видимому, включены в значения universal-symbol-name , перечисленные в Приложении D, поэтому их использование в идентификаторах должно быть приемлемым, если только вы не используете некоторые ненормальные символы вне указанных значений. Однако заменяющий текст для каждого макроса должен состоять из надлежащих токенов препроцессора, которые включают целые строки и символьные константы, но не включают отдельные символы кавычек.

0 голосов
/ 10 июня 2019

Нет, вы не можете.Препроцессор C работает на токенах , а не на тексте.Токен - это полное слово, например int или some_variable, или оператор или знак пунктуации, например ; или += и т. Д. Строковый литерал "hello world" представляет собой один токен.Комментарии удаляются перед заменой препроцессора.

Что-то вроде #define some_korean " является синтаксической ошибкой, поскольку текст замены для макроса не является последовательностью токенов.Это даже если some_korean на самом деле some_korean, а не корейские символы.Проблема с текстом замены, а не с именем макроса.C не работает таким образом.

K & R C препроцессор работал на текстовом уровне. Поэтому некоторые компиляторы K & R C могут обрабатывать " в качестве замены макросатак, как вы хотите. Но эти компиляторы, вероятно, вообще не поддерживают корейские символы. K & R C был заменен в 1989 году и почти полностью исчез в начале 2000-х.)

0 голосов
/ 10 июня 2019

Очень немногие компиляторы позволяют использовать символы Unicode в качестве идентификаторов.Насколько я знаю, только Clang поддерживает это без каких-либо проблем.

https://godbolt.org/z/1SCv3c

Так что просто придерживайтесь ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...