Как проверить / обнаружить предложение if без фигурных скобок?
В проекте кода C/C++ я хотел бы найти все if/else предложения, которые не используют фигурные скобки. Есть ли какая-нибудь проверка компилятора или утилита, чтобы найти их?
Основная проблема заключается в том, что я хочу переопределить некоторые макросы отладки, чтобы избежать оценки трассировок в некоторых условиях (знает ли кто-нибудь другое решение?). И мне нужно найти их, чтобы избежать "проблемы висячих-else" , как указано в " if "блок без фигурных скобок делает последующее" else if" вложенные
Фрагменты кода:
Перед модификацией:
DEBUG GET_DEBUG_DST(DEBUG_LEVEL_DEBUG).nospace() << DEBUG_PREFIX << __PRETTY_FUNCTION__
Теперь мы будем использовать if без скобок внутри:
DEBUG if (getDebugmode(DEBUG_LEVEL_DEBUG)) GET_DEBUG_DST(DEBUG_LEVEL_DEBUG).nospace() << DEBUG_PREFIX << __PRETTY_FUNCTION__
Пример проблемного кода:
if (my condition)
DEBUG << "hi there";
else
{some more code;}
3 ответов:
Просто переверните логику и поместите активную часть в else ответвление:
#define DEBUG if( !getDebugmode( DEBUG_LEVEL_DEBUG ) ) \ ; \ else \ GET_DEBUG_DST( DEBUG_LEVEL_DEBUG ).nospace() \ << DEBUG_PREFIX << __PRETTY_FUNCTION__Поскольку существует совпадение
elseдляif, он не может подобрать любые дополнительныеelse.
Я хотел бы найти в проекте кода c / c++ все предложения if / else, которые не используют фигурные скобки. Существует ли какая-либо проверка компилятора или утилита для их поиска?
Это звучит как x-y задача. Если вы пытаетесь заменить отладочный макрос на no-op, который не сделает недействительным синтаксис if, вы можете использовать:
#ifdef DEBUG_ENABLED #define DEBUG GET_DEBUG_DST(DEBUG_LEVEL_DEBUG).nospace() << DEBUG_PREFIX // ... #else #define DEBUG do {;} while(false); /##/ #endifВ этом случае отладка будет допустимой операцией (не делает недействительным else из-за пустоты в блоке if), и все, что в той же строке (данные сообщения отладки) будет вычислено:
if (my condition) do {;} while(false); // << "hi there"; else {some more code;}Это имеет тот недостаток, что не позволяет использовать многострочные комментарии отладки, хотя:
if (my condition) DEBUG << "hi there" << "some more data on a different line"; // causes error if DEBUG is no-op else {some more code;}
Плохая идея.
Использование:
#определение отладки(Х) У { если (DEBUG_LEVEL) print_stuff(х); } пока(0)
, что позволяет избежать этой проблемы.
Comments