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

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

 Jane16 мая 2012 г., 22:36
это одна из причин, почему иногда я не хочу что-то здесь задавать, потому что многие люди думают, что глупо задавать такие простые вопросы здесь. Да, я полностью согласен с ними, но я действительно не могу понять, что странного, если я хочу знать ответ на этот простой вопрос.
 Cheers and hth. - Alf16 мая 2012 г., 22:08
+1, чтобы противостоять необъяснимым понижениям.
 Keith Thompson22 дек. 2013 г., 08:28
Один ответ подразумевает, что вопрос был о том, почему включить<cassert> в отличие от<assert.h>, Если это и было намерением ФП, вопрос должен сказать так. Если бы вопрос был о том, что<cassert> или же<assert.h> используется для любой ссылки или руководства C или C ++.
 user14201916 мая 2012 г., 22:19
Как этоnot a real question? Потому что это коротко? Это законный вопрос. Это не не по теме, это реально, не слишком локализовано и не неконструктивно. Этоmight будь дураком, но я не уверен. Если это закрыто, я снова его откроюimmediately.
 Cheers and hth. - Alf16 мая 2012 г., 22:09
@ close-избирателей: пожалуйста, голосуйте только по тем вопросам, которые вы понимаете. Ваше отсутствие понимания НЕ означает отсутствие смысла или невозможность ответить на вопрос. Ваше отсутствие понимания только указывает на то, что вы не понимаете, что является противоположностью того, чтобы быть компетентным для голосования по данному вопросу.

Ответы на вопрос(4)

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

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

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

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

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

Addendum22 декабря 2013 г .:

Стандарт определяет каждый C ++C header & Lt; X.h & GT; заголовок в терминах & lt; cX & gt; заголовок, который, в свою очередь, определяется в терминах соответствующего заголовка библиотеки C.

C++11 §D.5/2:

“Every C header, each of which has a name of the form name.h, behaves as if each name placed in the standard library namespace by the corresponding cname header is placed within the global namespace scope.”

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

“The header <cstdlib> assuredly provides its declarations and definitions within the namespace std. It may also provide these names within the global namespace. The header <stdlib.h> assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespace std.”

Пользователь переполнения стекаC.R.Комментарий позволил мне понять, что некоторые версии g ++, такие как MinGW g ++ 4.7.2, довольноnon-standard с уважением к<X.h> заголовки, не имеющие перегрузок, например,sin что стандарт C ++ требует:

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

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

ignoring the g++ issue, or

avoiding using the missing g++ overloads,
e.g. using only double sin( double ), or

using the std namespace overloads
(one then needs to include <cmath> to guarantee their presence with g++).

Для того, чтобы использовать G ++std перегрузки пространства имен неквалифицированы, одним из практических подходов является определениеheaders wrappers для этого компилятора. Я использовал этот подход для устранения недостатков g ++. кprintf семьи. Как однажды заметил Дэвид Уилер, «все проблемы в области компьютерных наук могут быть решены с помощью другого уровня косвенного обращения». # #2020;

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

 Jane16 мая 2012 г., 22:26
Я использую Visual Studio 10 Professional. Вы имеете в виду, что используете & lt; assert.h & gt; лучше вместо & lt; cassert & gt ;?
 Jane16 мая 2012 г., 22:23
Спасибо за объяснение! :)
 16 мая 2012 г., 22:30
Это является более значимым, и общая практика использования заголовков [* .h] (в отношении библиотеки C) делает код немного более устойчивым, что с меньшей вероятностью создает проблемы с другими компиляторами.
 22 дек. 2013 г., 09:09
@ Cheersandhth.-Alf:std::sin иметь перегрузки дляdouble, float а такжеlong double а такжеstd:complex, в то время какsin только принимаетdouble аргумент.sinf заfloat а такжеsinl заlong double.
 22 дек. 2013 г., 10:07
Стандартные примеры являются ненормативными, но поясняющими. Например. & # xA7; D.5 / 3 & quot; [Пример: заголовок & lt; cstdlib & gt; несомненно, предоставляет свои объявления и определения в пространстве имен std. Он также может предоставлять эти имена в глобальном пространстве имен. Заголовок & lt; stdlib.h & gt; несомненно, обеспечивает те же объявления и определения в глобальном пространстве имен, как и в стандарте C. Он также может предоставлять эти имена в пространстве имен std. & # x2014; конец примера] & quot;

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

 Jane16 мая 2012 г., 22:28
Спасибо за короткий и четкий ответ :)

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

Увидеть легко доступныссылка

#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";
}
 Jane16 мая 2012 г., 22:07
Большое спасибо за помощь! Я за такой глупый вопрос. Я сделаю это сейчас.
 16 мая 2012 г., 22:12
@ Джейн, добро пожаловать. Также, пожалуйста, посмотрите на FAQ:stackoverflow.com/faq
 16 мая 2012 г., 22:06
Nitpicking: cppreference.com isa referenceнеthe reference, Если вы хотите сослаться наthe referenceсм. «Международный стандарт ИСО / МЭК 14882» или одно из его изданий: «14882: 1998», «14882: 2003» или «14882: 2011».

Ваш ответ на вопрос