Как проверить / обнаружить предложение 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;}
434   3  
c++

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

    Ничего не найдено.