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