Явное упоминание намеренной точки с запятой

проблема

Я использовал пустое утверждение и знаю об этом. Так как я могу отключить предупреждение компилятора?

предупреждение C4390: ‘;’ : найдено пустое контролируемое утверждение; это намерение?

Там может быть способ явно сказать, что я хочу пустое утверждение.

Фон

В среде разработки функция отладки должна отображать сообщение об ошибке и выходить из приложения. В продуктивном релизе это ничего не должно делать. Поэтому я написал макрос для этого.

#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif

2

Решение

Общая идиома пустого макроса оператора такова:

#define Debug(text) do {} while (0)

Как отмечает Бен в комментарии, целесообразно использовать эту технику в обеих версиях макроса.

#ifdef _DEBUG
#include <iostream>
#define Debug(text) do { cout << "Error: " << text; cin.get(); exit(1); } while (0)
#else
#define Debug(text) do {} while (0)
#endif

Эта идиома обсуждается во многих местах. Например:

4

Другие решения

Вы можете явно указать компилятору, что вы ничего не делаете

(void)0;
2

Debug используется как функциональный макрос, но не действует как один:

if( some_condition ) Debug(); else { blah }    // Ooops

Кроме того, он портится со стандартным потоком вывода, включает в себя различные заголовки для отладки и сборки выпуска, использует зарезервированный символ (начинается с подчеркивания, а затем с верхнего регистра) _DEBUG (Вы имели в виду использовать стандартные NDEBUG?) и без необходимости использует нестандартное значение выхода.

Так что вместо нынешних

#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif

делать

#ifndef DEBUGGING_H
#define DEBUGGING_H

#include <iostream>      // std::cerr, std::endl
#include <stdlib.h>      // exit, EXIT_FAILURE

#ifdef MYDEBUG
#   define Debug(text) ::debugging::sayByeAndTerminate( text )
#else
#   define Debug(text)
#endif

namespace debugging {
inline void sayByeAndTerminate( char const* const text )
{
using namespace std;
cerr << "Error: " << text; cin.get(); exit(EXIT_FAILURE);
}
}  // namespace debugging

Обратите внимание, что приведенный выше код не использовать глупо

do {} while( false )

ни дважды глупый

(void)0

потому что нет необходимости писать что-то, только чтобы ничего не получить.

Ничто не является абсолютно хорошим ничем.

Для предупреждения: я не могу воспроизвести его с Visual C ++ 11 (пожалуйста, укажите полный пример, который демонстрирует поведение), но просто выключи. Не корректируйте код так, чтобы он соответствовал компилятору. Просто выключите предупреждение.

Отказ от ответственности: оригинальный код, не тронутый руками компиляторов.

1
По вопросам рекламы [email protected]