Здравствуйте, CreatorCray, Вы писали:
CC>Он хочет не светить свои
Если что, я лишь несколько лет назад открыл для себя /pdbaltpath, а до этого бинарники много лет выпускались с полным путем к PDB.
А сейчас просто сколходил себе набор средств для удобной регистрации ошибок и передачи их на верхние уровни, и теперь в бинарниках стало слишком много имен файлов с полными путями.
Здравствуйте, Евгений Музыченко, Вы писали:
V>>можно описаться в имени включаемого файла и попасть на "неизвестно где".
ЕМ>И при этом все продолжит успешно компилироваться и хотя бы более-менее работать?
Сэкономит время при удивлении, что там не компиллируется.
ЕМ>Сможете найти реальный пример, в котором такое может получиться случайно?
Вообще, несколько раз бывало, когда классы внутренних библиотек совпадают по именам (но в разных неймспейсах) с публичными классами, которыми пользуются клиенты либы.
Причём, еще и названия методов порой чуть ли не 1-в-1. ))
ЕМ>Ну да, я хочу, чтоб в бинарник складывались имена исходных файлов с номерами строк, в которых происходят различные операции, чтобы это можно было записывать в логи, но чтоб не демонстрировать миру структуру каталогов в моей рабочей системе.
У нас для этого в h-файлах описаны макросы, которые используются в cpp-файлах.
Это достаточно общеупотребимая техника, используется примерно так:
namespace SomeNamespace {
struct SourceInfo {
const char * fileName;
const char * funcName;
const char * fileLine; // угу, номер строки хранится как текст, а не как число
SourceInfo() {}
SourceInfo(const char * file, const char * line, const char * func)
: fileName(file)
, funcName(func)
, fileLine(line) {}
bool hasData() const {
return !funcName.empty() || !fileName.empty();
}
bool empty() const {
return !hasData();
}
};
}
...
#define FULL_SOURCE_INFO \
::SomeNamespace::SourceInfo(__FILE__, BOOST_STRINGIZE(__LINE__), BOOST_CURRENT_FUNCTION)
#define SOURCE_FUNC \
::SomeNamespace::SourceInfo(nullptr, nullptr, BOOST_CURRENT_FUNCTION)
#define SOURCE_LINE \
::SomeNamespace::SourceInfo(__FILE__, BOOST_STRINGIZE(__LINE__), nullptr)
#if (defined(CFG_TRACE) || defined(CFG_DEBUG))
# ifdef CFG_DEBUG
# define SOURCE_INFO FULL_SOURCE_INFO
# else
# define SOURCE_INFO SOURCE_FUNC
# endif
#else
# define SOURCE_INFO \
(::SomeNamespace::SourceInfo())
#endif
Ну и, операторы вывода << этого SourceInfo для std::ostream и своих легковесных форматтеров.
Насколько я понимаю, у тебя некие есть операции, в которых может происходить логгирование, и они описаны в h-файлах.
У нас такое встречается редко, там просто добавляется аргумент SourceInfo по константной ссылке, а в месте вызова из cpp юзается макро SOURCE_INFO.
Здравствуйте, Евгений Музыченко
Вы не хотите светить полные пути в бинарнике, так?
Идея вот в чём. Пишем
consteval функцию, которая возвращает
std::array
В функции мы от
std::string_view{__FILE__} откусываем начальные пути из указанного перечня
И копируем остаток в результирующий
std::array
Я проверил бинарник на содержание путей. Тема рабочая для vs community 2022 (и clang 16, судя по asm-у в готболте)
Чек:
https://godbolt.org/z/8bWvqPM1v
upd: нулевой терминатор тут не копируется, тк массив уже с zero initialization
#include <iostream>
#include <string_view>
#include <array>
#include <algorithm>
using namespace std::literals::string_view_literals;
using omg = std::array<char, 100>; // или сколько надо
consteval omg
so_path(std::string_view path)
{
std::array cut{
"/app"sv,
"/omg"sv
};
for( std::string_view it : cut )
{
if( path.starts_with(it) )
{
path.remove_prefix( it.size() );
break;
}
}
omg ret{};
std::ranges::copy( path, ret.begin() );
return ret;
}
constexpr omg
g_path = so_path(__FILE__);
int main()
{
std::cout << g_path.data() << '\n';
return 0;
}
Из минусов:
* приходится указывать в функции что откусываем, но это не идёт в бинарник
* массив фиксированной длинны
Здравствуйте, Sm0ke, Вы писали:
S>Пишем consteval функцию, которая возвращает std::array
Да, идея рабочая, но я по ряду причин пока не хочу использовать возможности за пределами C++11. Ну а то, что для исправления древней кривизны годится только такой навороченный костыль — это ж гребаный стыд, забивание гвоздей микроскопом...
((