Как получить только имя файла в препроцессоре? - PullRequest
7 голосов
/ 13 сентября 2011

Я (был) использовал макросы __FILE__ и __LINE__ для печати диагностических сообщений из моего кода. Это работает довольно хорошо, когда вы используете GCC с make, файл такой же короткий, как вы указали его в командной строке. Недавно я перешел на использование CodeLite, который использует полные имена файлов (по крайней мере, под Windows) при сборке. Внезапно мой диагностический вывод почти не читается.

Есть ли способ получить только файловый компонент имени файла в препроцессоре? Я могу жить с непереносимым специфическим решением GCC. (Я вернусь к простым __FILE__ другим случаям.)

Конечно, я могу передать содержимое __FILE__ через функцию и извлечь только файловый компонент, но строковые операции не были предназначены для диагностических сообщений, которые не должны изменять поведение во время выполнения ...

ПРИМЕЧАНИЕ: Я использую имя файла так, как его использует GNU. Путь - это коллекция имен файлов, а имя файла - это относительный или абсолютный идентификатор файла. Имя файла может состоять из компонента каталога и компонента файла.

Ответы [ 3 ]

9 голосов
/ 16 ноября 2011

Если вы используете GNU Make, вы можете просто передать -D BASE_FILE_NAME = \ "$ *. C \" на этапе предварительной обработки (если вы делаете это отдельно, или на этапе компиляции, если на одном этапе). , что является нормой).

Это зависит от того, как вы определили имена файлов. Мои приходят из списка простых имен файлов и имеют префиксы с каталогами, использующие функции в make-файле на более позднем этапе.

IE, это хорошо работает для меня, но ваш пробег может отличаться! : -)

Упрощенная версия моего кода "make":

CLASSES = main.c init.c

PREPROCESSED = $(patsubst %.c,$(PPCDIR)/%.pp.c,$(CLASSES))

$(PREPROCESSED): $(PPCDIR)/%.pp.c: %.c $(ALLH) 
    $(GCC) $(GCCOPTS) -D BASE_FILE_NAME=\"$*\" -E $< > $@

Просто используйте BASE_FILE_NAME в своем коде, как вам нравится: -)

5 голосов
/ 12 декабря 2013

В ответ на FredCooke выше вы можете обменять эту строку:

-D BASE_FILE_NAME=\"$*.c\"

С:

-D BASE_FILE_NAME=\"$(<F)\"

Это даст вам правильное расширение имени файла, в том числе и для .cpp.

4 голосов
/ 19 сентября 2011

Не существует известного макроса препроцессора, обеспечивающего эту функциональность.Прохождение __FILE__ через функцию швов, как единственный разумный вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...