Подтвердить что ты не робот

В каких случаях нам нужно включить <cassert>?

В каких случаях мы должны включать cassert?

4b9b3361

Ответ 1

Короче говоря, не используйте его; используйте <assert.h>.

С++ 11 удалил любую формальную гарантию заголовка "c....", не загрязняя глобальное пространство имен.

Это никогда не было гарантией на практике, и теперь это даже не формальная гарантия.

Следовательно, с С++ 11 больше не существует мыслимого преимущества в использовании вариантов заголовков "c....", хотя существует явный и явный недостаток, заключающийся в том, что код, который хорошо работает с одним компилятором и версией этого компилятор, может не скомпилироваться с другим компилятором или версией из-за, например, коллизии имен или различный выбор перегрузки в глобальном пространстве имен.

SO, в то время как cassert был довольно бессмыслен в С++ 03 (вы не можете поместить макрос в пространство имен), это совершенно бессмысленно - даже как частный случай общей схемы - в C + +11.


Добавление, декабрь 22 2013:

Стандарт определяет каждый заголовок С++ C < X.h > заголовка в терминах <cX> заголовок, который, в свою очередь, определен в терминах соответствующего заголовка библиотеки C.

С++ 11 §D.5/2:

"Каждый заголовок C, каждый из которых имеет имя формы name.h, ведет себя так, как будто каждое имя, помещенное в пространство имен стандартной библиотеки соответствующим заголовком cname, помещается в область глобального пространства имен."

С++ 11 §D.5/3 (ненормативный пример):

"Заголовок <cstdlib>, несомненно, предоставляет свои декларации и определения в пространстве имен std. Он также может предоставлять эти имена в глобальном пространстве имен. Заголовок <stdlib.h>, несомненно, предоставляет те же декларации и определения в глобальном пространстве имен, как и в стандарте C. Он также может содержать эти имена в пространстве имен std."

Пользователь CR & rsquo; комментарий s дал мне понять, что некоторые версии g++, такие как MinGW g++ 4.7.2, довольно нестандартные относительно заголовков <X.h>, не имеющих перегрузок, например sin, который требует стандарт С++:

Я уже знал, что MinGW g++ 4.7.2 также полностью не имеет таких функций, как swprintf, и что он имеет такие недостатки в чистой библиотеке С++, как отсутствие С++ 11 std::to_string. Однако информация о нем, не имеющая перегрузок функции C, была для меня новой.

На практике отсутствие перегрузок с помощью g++ означает

  • игнорирование проблемы g++ или

  • избежать использования отсутствующих перегрузок g++,
    например используя только double sin( double ), или

  • с использованием перегрузок пространства имен std
    (тогда необходимо включить <cmath>, чтобы гарантировать их присутствие с g++).

Чтобы использовать переполнения пространства имен g++ std неквалифицировано, один практический подход заключается в определении оберток заголовков для этого компилятора. Я использовал этот подход для устранения недостатков g++ wrt. к семейству printf. Поскольку однажды Дэвид Уилер заметил: "Все проблемы в информатике могут быть решены другим уровнем косвенности" & hellip;

Тогда все может быть организовано так, что стандартный код, который использует g++, пропускает перегрузки, также компилируется с g++. Это настраивает компилятор на стандарт с фиксированным количеством кода.

Ответ 2

Как и любой другой файл заголовка, вы #include <cassert>, когда вы используете что-то, объявленное в этом заголовочном файле, например assert().

Ответ 3

См. легкодоступный reference

#include <iostream>
// uncomment to disable assert()
// #define NDEBUG
#include <cassert>

int main()
{
    assert(2+2==4);
    std::cout << "Execution continues past the first assert\n";
    assert(2+2==5);
    std::cout << "Execution continues past the second assert\n";
}

Ответ 4

assert.h определяет одну макрофункцию, которая может использоваться в качестве стандартного средства отладки.