Почему бы просто не сделать эту обычную функцию, которая использует wcslen()
, чтобы получить длину интересующего вас параметра. В этом макросе / функции происходит достаточно вещей, которые, я полагаю, мало что пытаются заставить быть встроенным. «Накладные расходы; wcslen()
вызов и обработка почти наверняка не станут узким местом.
Единственный трюк в макросе, который вас действительно должен беспокоить - это (как указал GMan) возврат из макроса, который скрыт при вызове макроса.
Просто создайте функцию, которая возвращает успех / неудачу, и вы можете вернуться, если функция завершится успешно:
bool PathPrefixResolve( std::wstring& path, wchar_t const* prefix, wchar_t const* environment)
{
wchar_t buffer[MAX_PATH];
if (boost::algorithm::istarts_with(path, prefix)) {
ExpandEnvironmentStringsW( environment, buffer, MAX_PATH);
std::wstring tmp( path);
tmp.replace(0, wcslen( prefix), buffer);
if (Exists(tmp)) {
path = tmp;
return true;
}
}
return false;
}
для использования функции:
//Check for those nasty cases where the beginning of the path has no root
if (PathPrefixResolve2(path, L"\\", L"")) return path;
if (PathPrefixResolve2(path, L"?\?\\", L"")) return path;
if (PathPrefixResolve2(path, L"\\?\\", L"")) return path;
if (PathPrefixResolve2(path, L"globalroot\\", L"")) return path;
if (PathPrefixResolve2(path, L"system32\\", L"%systemroot%\\System32\\")) return path;
if (PathPrefixResolve2(path, L"systemroot\\", L"%systemroot%\\")) return path;
Учитывая, какая обработка происходит в макросе, я не думаю, что вам нужно беспокоиться о накладных расходах при вызове функции.
Кроме того, ваша реализация макроса имеет некоторое поведение, которое я думаю, вероятно, является ошибкой - если путь начинается с L"\\?\\"
, это означает, что он также начинается с L"\\"
и вашего первого вызова макроса:
PATH_PREFIX_RESOLVE(path, L"\\", L"");
изменит переменную path
. Поскольку программа поддерживается и добавляются дополнительные префиксы, проблема может быть замечена с другими префиксами пути. Эта ошибка отсутствует в версии функции, так как функция изменяет параметр пути только при проверенном совпадении.
Тем не менее, при работе с префиксами L"\\?\\"
и L"\\"
, возможно, все еще существует проблема, заключающаяся в том, что оба могут совпадать - необходимо убедиться, что вы передаете префиксы, которые могут совпадать более одного раза, в 'priority' заказ.