Как почти во всех уважающих себя проектах, в моем собственном также есть макрос для проверки некоторых условий в режиме отладки:
#ifndef NDEBUG
# define DCHECK(x) if (!(x)) { ... }
#else
# define DCHECK(x)
#endif
Но сейчас я хочу DCHECK()
некоторые сложные условия, такие как права доступа к файлам:
...
auto has_permissions = [fd] {
struct stat st;
if (fstat(fd, &st) == 0) {
return (st.st_mode & (S_IRUSR | S_IWUSR)) == (S_IRUSR | S_IWUSR);
}
return false;
};
DCHECK(has_permissions());
...
Кроме того, я не хочу загрязнять свой код лямбдами, которые нигде не используются, кроме подошвы DCHECK()
, поскольку в режиме Release они будут помечены как неиспользуемые переменные.
Таким образом, вопрос: есть ли компактный способ записи DCHECK()
оператор, который объявляет, выполняет и проверяет любое сложное условие?
Постскриптум Не обязательно использовать лямбды — это просто мое предложение.
P.P.S. DCHECK()
может быть переопределено, но все уже существующие вызовы должны работать без изменений.
Определите лямбду в пределах DCHECK
макрос а также вызвать его
DCHECK(([]{ return false; }()));
// ^^