Каков лучший способ реализовать утверждение, регистрируясь в C++?

, если вы работаете вместе с большим количеством проектов, вы можете столкнуться с проблемой стиля.

* у вас должен быть один файл lof4j.properties, и в этот файл включены свойства журнала другого проекта.

* Кроме того, вы можете попытаться поместить файлы свойств log4j в путь src, когда проект работает. ОС Linux, файлы других файлов проекта и log4.properties могут находиться в одной папке в местоположении по пути к классам.

19
задан Mark Ingram 8 October 2008 в 08:07
поделиться

9 ответов

#include <cassert>

assert(something);

и в течение времени компиляции, проверяя, помехи Повышения утверждают, довольно полезны:

#include <boost/static_assert.hpp>

BOOST_STATIC_ASSERT(sizeof(int) == 4);  // compile fails if ints aren't 32-bit
29
ответ дан 30 November 2019 в 01:53
поделиться

Это зависит от того, ищете ли Вы что-то, что работает за пределами Visual C++. Это также зависит от того, какое утверждение Вы ищете.

существует несколько типов утверждений:

  1. Препроцессор
    Эти утверждения сделаны с помощью директивы препроцессору #error
    , утверждения Препроцессора только оценены во время фазы предварительной обработки и поэтому не полезны для вещей, таких как шаблоны.

  2. Выполняют Время
    , Эти утверждения сделаны с помощью assert(), функция, определяемая в <cassert>
    Выполняется, утверждения времени только оценены во времени выполнения. И поскольку BoltBait указал, не компилируются в том, если NDEBUG макрос был определен.

  3. Статичный
    Эти утверждения сделаны, как Вы сказали, при помощи ASSERT() макрос, но только если Вы используете MFC. Я не знаю о другом способе сделать статические утверждения, который является частью стандарта C/C++, однако, библиотека Boost предлагает другое решение: static_assert.
    Эти static_assert функция из библиотеки Boost - что-то, что будет добавленным в C++ 0x стандарт .

Как дополнительное предупреждение, эти assert() функция, что у предложенного Ferruccio нет того же поведения как макрос MFC ASSERT(). Первый - выполнить утверждение времени, в то время как позже статическое утверждение.

я надеюсь, что это помогает!

13
ответ дан 30 November 2019 в 01:53
поделиться

Утверждайте (обычно) Отладка Только

, проблема с "утверждает", то, что это обычно находится в двоичных файлах отладки, и что некоторые разработчики используют их, как будто код все еще работал бы.

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

, Но иногда (большинство времен?), тесты не так интенсивны как требуемый. Я не буду говорить о старом задании, где мы должны были кодировать, пока самая последняя минута ( не делают, не спрашивает... Иногда, менеджеры справедливы... Гм... )... Какой смысл утверждения Вас добавляющий к коду, который будет скомпилирован и поставлен как Двоичный файл Выпуска клиенту в следующую минуту?

Утверждают в (немного) реальные применения

В нашей команде, нам было нужно что-то для обнаружения ошибки, и в то же время что-то еще для обработки ошибки. И нам был нужен он, потенциально, на Сборке конечных версий.

Утверждают, и обнаружит и обработает ошибку только на отладочной сборке.

, Таким образом, мы добавили вместо этого макрос XXX_ASSERT, а также макрос XXX_RAISE_ERROR.

макрос XXX_ASSERT сделал бы то же самое как УТВЕРЖДАТЬ макрос, но это будет создано и в Отладке и в Выпуске. Его поведением (пишут журнал, открывают messagebox, ничего не делают, и т.д.) мог управлять.INI файл, и ЗАТЕМ он прервется/выйдет приложение.

Это использовалось как:

bool doSomething(MyObject * p)
{
   // If p is NULL, then the app will abort/exit
   XXX_ASSERT((p != NULL), "Hey ! p is NULL !") ;

   // etc.
}

макрос XXX_RAISE_ERROR только "зарегистрировал" бы ошибку, но не попытается обработать ее. Это означает, что могло зарегистрировать сообщение в файле и/или открыть MessageBox с сообщением и кнопку для продолжения, и другой для запуска сеанса отладки (согласно.INI конфигурации файла). Это использовалось как:

bool doSomething(MyObject * p)
{
   if(p == NULL)
   {
      // First, XXX_RAISE_ERROR will alert the user as configured in the INI file
      // perhaps even offering to open a debug session
      XXX_RAISE_ERROR("Hey ! p is NULL !") ;
      // here, you can handle the error as you wish
      // Than means allocating p, or throwing an exception, or
      // returning false, etc.
      // Whereas the XXX_ASSERT could simply crash.
   }

   // etc.
}

Спустя один год после того, как их введение в нашем освобождает, только XXX_RAISE_ERROR используется. Конечно, это не может использоваться на строго ограниченных во времени частях приложения (у нас есть XXX_RAISE_ERROR_DBG для того), но везде еще, это хорошо. И те, что можно использовать любую предпочтенную обработку ошибок, и что она может быть активирована по желанию, или на компьютере разработчика, или на тестере или даже пользователе, довольно полезны.

10
ответ дан 30 November 2019 в 01:53
поделиться

Для повреждения в файле, который названный утверждением, можно использовать пользовательский макрос, который выдает исключение или вызовы __debugbreak:

#define MYASSERT(EXPR, MSG) if (!(EXPR)) throw MSG;

Или:

#define MYASSERT(EXPR) if (!(EXPR)) __debugbreak();
6
ответ дан 30 November 2019 в 01:53
поделиться

Отвечать на вопрос в Вашем втором "редактировании":

< assert.h> является заголовком C

< cassert> является заголовком Библиотеки Стандарта C++... он обычно включает < assert.h>

9
ответ дан 30 November 2019 в 01:53
поделиться

определенный для Microsoft CRT утверждает

#include <crtdbg.h>
#include <sstream>
...
// displays nondescript message box when x <= 42
_ASSERT(x > 42);
// displays message box with "x > 42" message when x <= 42
_ASSERTE(x > 42);
// displays message box with computed message "x is ...!" when x <= 42
_ASSERT_EXPR(
   x > 42, (std::stringstream() << L"x is " << x << L"!").str().c_str());
5
ответ дан 30 November 2019 в 01:53
поделиться

используйте intellisense для открытия его в Visual Studio (щелчок правой кнопкой)

// cassert standard header
#include <yvals.h>
#include <assert.h>

, yvals.h является материалом окон. таким образом, до утверждают (), самостоятельно затронут, эти два способа включать его идентичны. это - хорошая практика для использования <cxxx>, потому что часто это не настолько просто (обертывание пространства имен и возможно другое волшебство)

, Это повреждается на сайте вызывающей стороны для меня...

вот статья , объясняющая, почему Вы не хотите писать этот макрос сами.

1
ответ дан 30 November 2019 в 01:53
поделиться

Основной Утверждают Использование

#include <cassert>

/* Some code later */
assert( true );

, Примечания Лучшей практики

Утверждают, используются для идентификации состояния во время выполнения, которые должны быть верны . В результате они компилируются в режиме выпуска.

, Если у Вас есть ситуация, где Вы хотите, чтобы утверждение всегда совершило нападки, можно передать ложь ему. Например:

switch ( someVal ):
{
case 0:
case 1:
  break;
default:
  assert( false ); /* should never happen */
}

также возможно передать сообщение через, утверждайте:

assert( !"This assert will always hit." );

Сформировавшиеся кодовые базы часто расширяют утверждать функциональность. Некоторые общие расширения включают:

  • Переключение утверждает на основе на модуль для локализации тестирования.
  • Создание дополнительного утверждает макрос, который компилируется в большинстве сборок отладки. Это желательно для кода, который называют очень часто (миллионы времен в секунду) и вряд ли будет неправильным.
  • пользователи Разрешения для отключения в настоящее время, который утверждает хит все утверждает в единице компиляции, или все утверждает в кодовой базе. Это останавливается мягкий, утверждает от того, чтобы быть инициированным, создавая неприменимые сборки.
6
ответ дан 30 November 2019 в 01:53
поделиться

Существует более продвинутая библиотека с открытым исходным кодом под названием ModAssert, в которой есть утверждения, которые работают как в Visual C ++, так и в gcc. Наверное, и на других компиляторах, точно не знаю. На его изучение уходит время, но если вам нужны хорошие утверждения, не зависящие от MFC, взгляните на них. Это на http://sourceforge.net/projects/modassert/

3
ответ дан 30 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: