In quali casi dovremmo includere cassert?In quali casi è necessario includere <cassert>?
risposta
Proprio come qualsiasi altro file di intestazione, è #include <cassert>
quando si utilizza qualcosa dichiarato in tale file di intestazione, ad esempio assert()
.
Grazie per la risposta breve e chiara :) – Jane
vedere una facilmente accessibile 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";
}
* Nitpicking *: cppreference.com è ** un riferimento **, non ** il riferimento **. Se si desidera fare riferimento a ** il riferimento **, fare riferimento a "Standard internazionale ISO/IEC 14882" o una delle sue edizioni: "14882: 1998", "14882: 2003" o "14882: 2011". –
Grazie mille per l'aiuto! Sono astuto per una domanda così stupida. Lo farò ora. – Jane
@Jane Prego. Inoltre, si prega di dare un'occhiata alle FAQ: http: // StackOverflow.com/faq – TemplateRex
Insomma, non ne fanno uso; utilizzare <assert.h>
.
C++ 11 rimossa alcuna garanzia formale di una "c ...." Intestazione non inquinare il namespace globale.
Non è mai stata una garanzia in pratica, e ora non è nemmeno una garanzia formale.
Quindi, con C++ 11 non c'è più alcun vantaggio immaginabile nell'uso delle varianti di intestazione "c ....", mentre c'è lo svantaggio netto e chiaro di quel codice che funziona bene con un compilatore e una versione di che compilatore, può riuscire a compilare un altro compilatore o versione, ad esempio a causa nome collisioni o diversa selezione di sovraccarico nel namespace globale.
SO, mentre cassert
era piuttosto privo di significato in C++ 03 (non è possibile inserire una macro in uno spazio dei nomi), è totalmente privo di significato - anche come caso speciale di uno schema generale - in C++ 11.
addendum, Dec 22 2013:
Lo standard definisce ogni C++ intestazione C <Xh> intestazione in termini di CX > intestazione <, che a sua volta è definito in termini di intestazione della libreria C corrispondente.
C++ 11 §D.5/2:
“ Ogni C intestazione, ognuno dei quali ha un nome del modulo
name.h
, si comporta come se ogni nome collocato nello spazio dei nomi libreria standard dalla corrispondente cname l'intestazione viene posizionata nell'ambito dello spazio dei nomi globale. ”
C++ 11 §D.5/3 (esempio non normativo):
“ L'intestazione
<cstdlib>
fornisce sicuramente sue dichiarazioni e definizioni all'interno del namespacestd
. Può anche fornire questi nomi all'interno del namespace globale. L'intestazione<stdlib.h>
fornisce sicuramente le stesse dichiarazioni e definizioni all'interno dello spazio dei nomi globale, proprio come nello standard C. Può anche fornire questi nomi all'interno del namespacestd
. ”
Stack Overflow utente C.R. ’ s commento mi ha reso consapevole che alcune versioni di g ++, come MinGW g ++ 4.7.2, sono piuttosto non standard rispetto alle intestazioni <X.h>
, prive dei sovraccarichi di, ad es. sin
che lo standard C++ richiede:
sapevo già che MinGW g ++ 4.7.2 anche manca del tutto funzioni come la swprintf
, e che ha carenze idem nel puro libreria C++ come privo C++ 11 std::to_string
. Tuttavia, le informazioni su di esso che mancavano del sovraccarico della funzione C erano nuove per me.
In pratica i sovraccarichi mancanti con g ++ significa
ignorando il problema g ++, o
evitando usando l'g mancanti ++ sovraccarichi,
esempio utilizzando solodouble sin(double)
, outilizzando lo spazio
std
sovraccarichi
(uno allora deve includere<cmath>
per garantire la loro presenza con g ++).
Per utilizzare il g ++ std
namespace Sovraccarichi qualificato, un approccio pratico è quello di definire intestazioni involucri del per questo compilatore. Ho usato questo approccio per affrontare le carenze di g ++. alla famiglia printf
. Come ha osservato una volta David Wheeler, “ Tutti i problemi dell'informatica possono essere risolti con un altro livello di riferimento indiretto ” e hellip;
Quindi è possibile organizzare le cose in modo che il codice standard che utilizza gli overload sovraccarichi di g ++ compili anche con g ++. Questo regola il compilatore sullo standard, con una quantità fissa di codice.
Grazie per la spiegazione! :) – Jane
Utilizzo Visual Studio 10 Professional. Intendi dire che usare
È più significativo e la pratica generale dell'uso delle intestazioni [* .h] (rispetto alla libreria C) rende il codice un po 'più robusto, con meno probabilità di essere problematico con altri compilatori. –
assert.h definisce una funzione macro che può essere utilizzata come strumento di debug standard.
+1 per contrastare i downvotes inspiegabili. –
@ close-voters: si prega di votare solo su domande che capisci. la tua mancanza di comprensione NON implica una mancanza di significato, o che è impossibile rispondere a una domanda. la tua mancanza di comprensione indica solo che non capisci, il che è l'opposto di essere competente a votare sulla questione. –
In che modo * non è una domanda reale *? Perché è breve? Questa è una domanda legittima. Non è fuori tema, è reale, non troppo localizzato e non non costruttivo. Potrei * essere un inetto, ma non ne sono sicuro. Se questo viene chiuso, lo riapre * immediatamente *. –