2014-12-05 6 views
1

У меня есть привычка использовать такой код для отладки блоков, которые не очень тривиально, чтобы написать:временного код отладки отключения

if(0) 
{ 
    // debugging code 
} 

Проблемой является "warning C4127: conditional expression is constant".

Я сохраняю комментарии к старым кодам, которые могут быть удалены в любое время в будущем (но нужно сохранить какое-то время, чтобы иметь возможность следовать намерениям оригинального автора). Я мог бы использовать «#if 0», но я не вижу улучшения в удобочитаемости, наоборот (но это может быть вопросом вкуса).

Какой будет более дружелюбное, более читаемое, бесплатное решение?

(Так как это больше вопрос о стиле, может быть, есть более StackExchange место для него)

EDIT код отладки не эквивалентна конфигурации отладки (_DEBUG): как правило, находится в пределах _DEBUG, но я не хочу, чтобы осквернить его, так что я должен отключить его if (0)

ответ

5

Использование препроцессор:

#if 0 
    // Deactivated code. 
#endif 

Вы также можете определить макрос DEBUG (или имя по вашему выбору), а затем сделать что-то вроде

#ifdef DEBUG 
    // Debug code. 
#endif 

Примечания: я предлагаю использовать свой собственный макрос вместо существующих (в _DEBUG или NDEBUG см _DEBUG vs NDEBUG).

+1

В дополнение к предупреждению компилятора, исключая условный код через препроцессор, ускоряет компиляцию, поскольку компилятор вообще не видит отключенный код. И вы не полагаетесь на оптимизатора, чтобы понять, что его можно устранить, поэтому вы, вероятно, получите меньший исполняемый файл даже в неоптимизированной сборке. – Wyzard

+1

@Wyzard Этот вид оптимизации ничто по сравнению с читабельностью. – Liviu

+1

Я не думаю, что '#if 0' является менее читаемым, чем' if (0) '. – Wyzard

1

Я хотел бы сделать это:

bool test = false; 
if (test) 
{ 
    ... 
} 

Это имеет дополнительное преимущество, что я могу установить контрольную точку на если заявление и изменить значение теста в то время как приложение работает, чтобы включить или отключить код отладки.

+0

Побочным эффектом является добавление другой переменной (другой тип загрязнения). Кроме того, я считаю, что это менее читаемо - предположим, что вы забыли об этом «истина», кто-то позже может подумать, что код необходим (для журнала ошибок, например), а 'if (1)'/'if (0) 'менее запутанным. – Liviu

3

Вы можете использовать запятую оператор (http://en.wikipedia.org/wiki/Comma_operator):

if (0,0) { 
    // ... 
} 

под VS2013 он снимает для меня это предупреждение, при высоком уровне предупреждения

[править]

в моем коде я иногда использую следующая идиома:

#if defined(_DEBUG) 
    static bool bVerbose = false; 
    if (bVerbose) { 
     // do some debugging code, like print to log some data structure etc. 
    } 
#endif 

тогда, когда я делаю шаг ough code и я место, которое требует больше исследований. Я меняю bVerbose в отладчике на true, и я могу видеть его вывод и т. д. Таким образом, мне не нужно перестраивать проект, чтобы включить отладочный код, а также попытаться воспроизвести проблему. Здесь также очень полезно изменить точку выполнения.

0

Возьмите это!Определение и вызвать функцию LAMDA

Con:

  • C++ 11 только

Pro

  • Constant но компилятор не получает его (по крайней мере, г ++)
  • Один вкладыш
  • Отсутствие состояния в других областях
  • Интуитивно понятный и легко запомнить;)

тестовый код

#include <iostream> 

#define ON ([]() { return true; }()) 
#define OFF ([]() { return false; }()) 

int main() 
{ 
    if (ON) 
    { 
     std::cout << "Block 1" << std::endl; 
    } 

    if (OFF) 
    { 
     std::cout << "Block 2" << std::endl; 
    } 

    return 0; 
} 

Edit: Что означало, как шутка, в первую очередь может быть довольно удобно, используя правильные макросы. См. Выше.

Смежные вопросы