В каких случаях мы должны включать cassert?
В каких случаях нам нужно включить <cassert>?
Ответ 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 определяет одну макрофункцию, которая может использоваться в качестве стандартного средства отладки.