Есть ли способ удалить кавычки в макросе C?
Предположим, что я хочуun-stringify аргумент макроса, который должен преобразовать "text"
в text
.
#define UN_STRINGIFY(x) /* some macro magic here */
Теперь вызов этого макроса удалит ""
из его аргумента
UN_STRINGIFY("text") // results in ----> text
Это было бы противоположностью макростронификации:
#define STRINGIFY(x) #x
Возможно ли это, или я играю с макро-злом?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 строку через макрос, который не известен до компиляции, то вы находитесь на неправильном пути в любом случае ;).