Как распечатать фунт / хешируют через препроцессор C?

Я предпочитаю Браузер JAR , он имеет простой интерфейс, где можно просмотреть несколько БАНОК и искать определенный класс через несколько БАНОК одновременно.

8
задан Jonathan Leffler 10 January 2015 в 03:54
поделиться

5 ответов

Ответ:

#define hash #
#define f(x) x
#define label(a) f(hash)a

затем

label(foobar)

создает

#foobar

Я нашел его с помощью всех вас , но особенно зимнего немого. Большое спасибо!

(Использование gcc 4.3.3)

13
ответ дан 5 December 2019 в 06:38
поделиться

Вы можете сделать что-то вроде этого:

#define f(x) x
#define label(a) f(#)a

Я протестировал это, запустив его напрямую через cpp (препроцессор C), а не через gcc . Пример:

cpp test > test.html

Использование cpp, который является частью gcc версии 4.0.1.

Единственная проблема, которую я заметил, заключается в том, что я получаю дополнительный нежелательный вывод, а именно первые 4 строки файла:

# 1 "test"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "test"
4
ответ дан 5 December 2019 в 06:38
поделиться

Строковые литералы в C будут объединены, поэтому вы можете сделать

#define label(x) "#" #x

Я не думаю, что это возможно без объединения строк (т.е. без вызова компилятора C, как вы хотите):

Вы можете делать некоторые причудливые вещи с дополнительными уровнями косвенности, и я даже получил препроцессор для генерации желаемого вывода через

#define hash #
#define quote(x) #x
#define in_between(c, d) quote(c ## d)
#define join(c, d) in_between(c, d)
#define label(x) join(hash, x)
label(foo)

Проблема в том, что он также будет генерировать сообщение об ошибке, поскольку in_between () расширяется до #foo , который не является допустимым токеном препроцессора. Я не вижу другого выхода.

Я бы посоветовал выбрать подходящий инструмент для работы: переключитесь на другой макроязык, такой как m4 или даже ML / I, если вы любите приключения, или используйте язык сценариев, такой как PHP или Perl. GPP тоже выглядит неплохо и может быть лучше.

3
ответ дан 5 December 2019 в 06:38
поделиться

Попробуйте:

#define label(x) "#"x
1
ответ дан 5 December 2019 в 06:38
поделиться

Я не Думаю, что вы можете, что не совсем необоснованно, поскольку на выходе препроцессора C не должно появляться «#» без кавычек, потому что это указывало бы на директиву препроцессора, и вы не можете генерировать директивы препроцессора на лету, как это.

Другими словами, препроцессор C является препроцессором для C (и C ++), а не полностью универсальным инструментом.

Либо используйте альтернативный макропроцессор ( m4 - стандартная рекомендация для Unix-подобных систем) или действовать по-другому.

Например, замените макрос:

#define label(x)    !@!x

Затем выполните постобработку вывода, заменив ' ! @! ' с '#'.

(Программа imake использует аналогичный трюк; препроцессор C делает большую часть работы, но его вывод не сохраняет разрывы строк, необходимые для 'make', поэтому 'imake 'использует нотацию' @@ \ 'или около того, чтобы указать, где нужно вставить разрывы строк после того, как препроцессор C сделал свое худшее.)

4
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: