Вопрос по header-files, c++ – В каких случаях нам нужно включить <cassert>?

43

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

это одна из причин, почему иногда я не хочу что-то здесь задавать, потому что многие люди думают, что глупо задавать такие простые вопросы здесь. Да, я полностью согласен с ними, но я действительно не могу понять, что странного, если я хочу знать ответ на этот простой вопрос. Jane
+1, чтобы противостоять необъяснимым понижениям. Cheers and hth. - Alf
Как этоnot a real question? Потому что это коротко? Это законный вопрос. Это не не по теме, это реально, не слишком локализовано и не неконструктивно. Этоmight будь дураком, но я не уверен. Если это закрыто, я снова его откроюimmediately. user142019
@ close-избирателей: пожалуйста, голосуйте только по тем вопросам, которые вы понимаете. Ваше отсутствие понимания НЕ означает отсутствие смысла или невозможность ответить на вопрос. Ваше отсутствие понимания только указывает на то, что вы не понимаете, что является противоположностью того, чтобы быть компетентным для голосования по данному вопросу. Cheers and hth. - Alf
Один ответ подразумевает, что вопрос был о том, почему включить<cassert> в отличие от<assert.h>, Если это и было намерением ФП, вопрос должен сказать так. Если бы вопрос был о том, что<cassert> или же<assert.h> используется для любой ссылки или руководства C или C ++. Keith Thompson

Ваш Ответ

4   ответа
41

Короче говоря, не используйте его; использование<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 ++. Это настраивает компилятор на стандарт с фиксированным количеством кода.

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

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

Спасибо за короткий и четкий ответ :) Jane
0

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

0

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

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

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