Есть ли способ удалить кавычки в макросе 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 строку через макрос, который не известен до времени компиляции, тогда вы все равно на неправильном пути;).