У меня очень большая кодовая база, которая широко использует __FILE__
для ведения журнала. Однако он включает полный путь, который (1) не нужен, (2) может привести к нарушениям безопасности.
Я пытаюсь написать выражение подстроки времени компиляции. Закончено этим решением
static constexpr cstr PastLastSlash(cstr str, cstr last_slash)
{
return *str == '\0' ? last_slash : *str == '/' ? PastLastSlash(str + 1, str + 1) : PastLastSlash(str + 1, last_slash);
}
static constexpr cstr PastLastSlash(cstr str)
{
return PastLastSlash(str, str);
}
// usage
PastLastSlash(__FILE__);
Это хорошо работает, я проверил ассемблерный код, строка обрезается во время компиляции, только двоичное имя файла присутствует.
Однако это обозначение слишком многословно. Я хотел бы использовать макрос для этого, но не удалось. Предлагаемый пример по ссылке выше
#define __SHORT_FILE__ ({constexpr cstr sf__ {past_last_slash(__FILE__)}; sf__;})
не работает для компилятора MSVC (я использую MSVC 2017). Есть ли другой способ сделать так, используя c ++ 17?
UPD1: лязг урезан функцией https://godbolt.org/z/tAU4j7
UPD2: похоже, что можно выполнить обрезку во время компиляции с использованием функций, но полная строка будет присутствовать в двоичном виде.