Есть ли способ удалить кавычки в макросе C?


Предположим, что я хочуun-stringify аргумент макроса, который должен преобразовать "text" в text.

#define UN_STRINGIFY(x) /* some macro magic here */

Теперь вызов этого макроса удалит "" из его аргумента

UN_STRINGIFY("text") // results in ----> text

Это было бы противоположностью макростронификации:

#define STRINGIFY(x) #x
Возможно ли это, или я играю с макро-злом?
2 11

2 ответа:

Это невозможно. И это, вероятно, хорошо: если вы передаете строку, вы предполагаете, что можете поместить в нее почти все. При снятии строки это внезапно привело бы к тому, что компилятор действительно заботился бы о содержании этой строки.

Я уже несколько раз подходил к этому вопросу и до сих пор не могу вобрать его в голову. Рассмотрим следующий пример:

#define FOO(x) x

// FOO( destringify("string x;"))   // no way

auto f = "string x;";
FOO(string x;)                      // hm whats the problem?

Мне кажется очевидным, что должно быть возможно удалить кавычки. Я имею в виду, что string x; - это не что иное, как "string x;" без кавычек. Дело в том, что это просто невозможно. Я не думаю, что для этого есть техническая причина, и можно только догадываться, почему нет метода, чтобы сделать это.

Тем не менее, я сумел убедить себя, вспомнив, что в основном все, что делает препроцессор, - это текстовая замена, поэтому зачем вам "де-текстифицировать" что-то, когда на уровне препроцессора все так или иначе является просто текстом. Просто сделай все наоборот. Когда я изменю приведенный выше пример на это:
#define FOO(x) x
#define STR(x) STRSTR(x)
#define STRSTR(x) #x

#define STR_X string x;

auto f = STR(STR_X)
FOO(STR_X)

, то нет никакой необходимости, чтобы преобразовать в строки. И если вы когда-нибудь окажетесь в ситуации, когда вы хотите де-stringify строку через макрос, который не известен до компиляции, то вы находитесь на неправильном пути в любом случае ;).