C: Написание макроса для создания управляющих последовательностей строк

Я работаю с японским кодом C, который печатает текст в Shift-JIS. В исходном коде текст записывается непосредственно в кане в строковых литералах. В моем редакторе, который ожидает UTF-8, это выглядит как чепуха.

В частности, этот код любит использовать «крупные» версии английских букв: http://www.rikai.com/library/kanjitables/kanji_codes.sjis.shtml \x82\x60 = A (большая буква «A», \x41 в ASCII). Я подумал, что напишу макрос CPP для преобразования из ASCII, например:

#define LARGE_LETTER(x) "\x82\x" (x+31)

Но, очевидно, этот макрос не совсем работает, и я не уверен, как заставить его работать, если это вообще возможно. Можете ли вы построить escape-последовательности строк, подобные этой?


person Rena    schedule 27.09.2014    source источник


Ответы (1)


Ну, для начала, почему бы не иметь много определений

#define LARGE_LETTER_A "\x82\x60"
#define LARGE_LETTER_B "\x82\x61"
…
#define LARGE_LETTER_Z "\x82\x7A"

Применение

char *str = "foo " LARGE_LETTER_A " baz";

Затем вы можете подняться на ступеньку выше с помощью primitive кошка

#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define LARGE_LETTER(x) PRIMITIVE_CAT(LARGE_LETTER_, x)

Применение:

char *str = "foo " LARGE_LETTER(A) " baz";
person Jeffery Thomas    schedule 27.09.2014
comment
это, вероятно, самый прагматичный подход, но я не вижу никакой ценности в макросе-оболочке - просто используйте определения напрямую; имейте в виду, что их можно поместить в заголовок, который автоматически генерируется с помощью языка сценариев по вашему выбору. - person Christoph; 27.09.2014
comment
@Christoph PRIMITIVE_CAT позволяет комбинировать макросы. Например, макрос, который возвращает A-Z, можно комбинировать с LARGE_LETTER: LARGE_LETTER(A_LETTER_SET_ELSEWERE()). Это делает его немного более гибким. - person Jeffery Thomas; 27.09.2014
comment
Подход с одним определением для каждой буквы — это тип повторения, которого я надеялся избежать. Я так понимаю альтернативы быть не может? - person Rena; 28.09.2014