C ++ подстрока во время компиляции - PullRequest
2 голосов
/ 06 июня 2019

У меня очень большая кодовая база, которая широко использует __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: похоже, что можно выполнить обрезку во время компиляции с использованием функций, но полная строка будет присутствовать в двоичном виде.

...