Это будет работать превосходное, так же, как возвращающийся посреди try{}finally{}
Возможность встроить вызов функции - это как оптимизация для конкретного компилятора , так и обычное поведение . То есть многие компиляторы могут это делать, но они не обязаны это делать.
Почему бы и нет
sizeof "[]" - 1;
(минус один для конечного нуля. Вы можете сделать sizeof "[]" - sizeof '\ 0', но sizeof '\ 0' в C часто бывает sizeof (int), а "- 1" отлично читается.)
#define TWO 2
#define STRING_LENGTH 2
/* ... etc ... */
Серьезно, зачем проходить все эти хлопоты только для того, чтобы не набрать 2? Я искренне думаю, что вы делаете свой код менее читабельным, и другие программисты будут пялиться на вас, как будто вы нюхаете использованный кофе из фильтра.
Я думаю, что большинство компиляторов оптимизируют его , когда оптимизация включена . Если они отключены, это может замедлить вашу программу намного больше, чем необходимо.
Я бы предпочел ваши шаблонные функции, поскольку они гарантированно не будут вызывать strlen
во время выполнения.
Конечно, вместо того, чтобы писать отдельные функции для char
и wchar_t
, вы можете добавить еще один аргумент шаблона и получить функцию, которая работает для любого типа:
template <typename Char_t, int len>
int static_strlen(const Char_t (&)[N] array){
return len / sizeof(Char_t) - 1;
}
(как уже упоминалось в комментарии, это даст забавные результаты, если будет передан массив целых чисел, но вы, вероятно, сделаете это? В конце концов, он предназначен для строк)
И последнее замечание, имя _strlen
- плохо . Все имена в области пространства имен, начинающиеся с подчеркивания, зарезервированы для реализации. Вы рискуете столкнуться с неприятными конфликтами имен.
Кстати, почему магическая константа «[]» меньше, чем 2?
В обоих случаях это литерал, который должен быть изменен, если формат строка сравнивается с изменениями.