LINUX.ORG.RU

макрос для имени файла без пути

 , , ,


0

2
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)

Не нравится, что имя файла содержит полный путь. Можно средставами препроцессора получить только имя файла без пути?

★★★

имя файла содержит полный путь

Не содержит. Там то что скармливается cpp. Это у вас система сборки скорее всего делает файл с полным путем

anonymous
()

Костыль 7 Максимальный: если в начале файла написать '#line 1 «whatever»', то __FILE__ будет раскрываться в «whatever».

xeiph
()
Ответ на: :) от Stil

Тогда уж костыли в костыль, а в те костыли свои костыли и так далее. Фрактальные костыли. Софт, он такой.

xeiph
()
Ответ на: комментарий от anonymous

Да, система сборки дает полный путь. Хотелось бы избавится от полного пути не меняя систему сборки.

vromanov ★★★
() автор топика

Ибавиться нормально не получится. Я для себя сделал такой костыль: cmake вычисляет длину пути до директории с исходниками и дефайнит ее:

string(LENGTH ${CMAKE_SOURCE_DIR}/src/ SOURCE_PREFIX_LENGTH)
add_definitions(-DSOURCE_PREFIX_LENGTH=${SOURCE_PREFIX_LENGTH})
Потом в коде логгера есть нечто такое (код упростил):
#ifndef SOURCE_PREFIX_LENGTH
#warning SOURCE_PREFIX_LENGTH is not defined, forcing to 0
#define SOURCE_PREFIX_LENGTH	0
#endif

#define trace(message) log((__FILE__ + SOURCE_PREFIX_LENGTH), __LINE__, message)

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от m0rph

Вот спасибо то! Отличная идея. То что нужно.. Можно, кстати дефайнить просто путь а в коде делать sizeof от него.

vromanov ★★★
() автор топика
Ответ на: комментарий от vromanov

Только возможно (я не проверял) компилятор сохранит в бинарнике всю строку - полное имя файла.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Не сохранит. Ведь при этом берется именно размер, который вычисляется во время компиляции. Во время исполнения исходная строка уже никому не нужна.

vromanov ★★★
() автор топика
Ответ на: комментарий от vromanov

Не факт. У тебя в функцию передается указатель на средину строки. А функция внутри может и назад откатываться - откуда компилятору знать? Вот он и сохранит всю строку.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Я про другую строку. Которая представляет из себя путь к папке где лежит файл.

vromanov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.