Re[11]: MS VC++: путь в __FILE__
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.08.23 09:34
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Он хочет не светить свои


Если что, я лишь несколько лет назад открыл для себя /pdbaltpath, а до этого бинарники много лет выпускались с полным путем к PDB. А сейчас просто сколходил себе набор средств для удобной регистрации ошибок и передачи их на верхние уровни, и теперь в бинарниках стало слишком много имен файлов с полными путями.
Re[9]: MS VC++: путь в __FILE__
От: vdimas Россия  
Дата: 15.08.23 10:53
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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.
Re: чистка путей
От: Sm0ke Россия ksi
Дата: 15.08.23 21:38
Оценка:
Здравствуйте, Евгений Музыченко

Вы не хотите светить полные пути в бинарнике, так?

Идея вот в чём. Пишем 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;
}


Из минусов:
* приходится указывать в функции что откусываем, но это не идёт в бинарник
* массив фиксированной длинны
Отредактировано 16.08.2023 1:01 Sm0ke . Предыдущая версия . Еще …
Отредактировано 15.08.2023 21:44 Sm0ke . Предыдущая версия .
Отредактировано 15.08.2023 21:39 Sm0ke . Предыдущая версия .
Отредактировано 15.08.2023 21:38 Sm0ke . Предыдущая версия .
Re: MS VC++: путь в __FILE__
От: Alekzander  
Дата: 16.08.23 09:02
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>для файлов, включенных #include "file.h", всегда кладутся полные пути, а для включенных #include <file.h> — относительные.


Всю жизнь знал именно так, и удивился бы, если бы было не так. Может, авторы документации неправильно поняли?
Re[2]: чистка путей
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.08.23 10:12
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Пишем consteval функцию, которая возвращает std::array


Да, идея рабочая, но я по ряду причин пока не хочу использовать возможности за пределами C++11. Ну а то, что для исправления древней кривизны годится только такой навороченный костыль — это ж гребаный стыд, забивание гвоздей микроскопом... ((
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.