Я использовал пустое утверждение и знаю об этом. Так как я могу отключить предупреждение компилятора?
предупреждение C4390: ‘;’ : найдено пустое контролируемое утверждение; это намерение?
Там может быть способ явно сказать, что я хочу пустое утверждение.
В среде разработки функция отладки должна отображать сообщение об ошибке и выходить из приложения. В продуктивном релизе это ничего не должно делать. Поэтому я написал макрос для этого.
#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif
Общая идиома пустого макроса оператора такова:
#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
Эта идиома обсуждается во многих местах. Например:
Вы можете явно указать компилятору, что вы ничего не делаете
(void)0;
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 (пожалуйста, укажите полный пример, который демонстрирует поведение), но просто выключи. Не корректируйте код так, чтобы он соответствовал компилятору. Просто выключите предупреждение.
Отказ от ответственности: оригинальный код, не тронутый руками компиляторов.