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

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

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

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

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

Это будет противоположно макроснижению:

#define STRINGIFY(x) #x

Возможно ли это, или я играю с малым злом?

Ответ 1

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

Ответ 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)

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

Ответ 3

У меня есть практическое использование для ситуации. В противном случае, я не мог бы искать это. Представьте себе, вы изначально объявляете структуру данных как строку. Но хотите создать экземпляр объекта этого типа, используя эту строку. Как можно это сделать? ответ отменил. Во время выполнения, если вы хотите показать некоторую справку о структуре данных, лучшего способа нет...