2011-12-14 16 views
18
  • Da dove proviene size_t quando non ho nulla incluso?
  • E 'ragionevole assumere sempre size_t == std::size_t?
  • Quando utilizzare lo size_type nei contenitori std (string::size_type, vector<T>::size_type, ecc.)?
+0

Sembra un compilatore specifico –

+0

Puoi spiegare cosa hai osservato per il tuo primo punto? Per il tuo compilatore, 'size_t a;' funziona come una dichiarazione anche quando non hai '# include'd qualcosa? Dal momento che sembra essere una domanda su un'implementazione, potresti dirci quale implementazione stai utilizzando? –

+0

@DavidThornley Questo è esattamente quello che vedo, sto usando VS2010 – David

risposta

10

Da dove proviene size_t quando non ho nulla incluso in un progetto vuoto?

Se non si dispone di nulla incluso, non è possibile utilizzare size_t. E 'definita a <stddef.h> (e forse anche in <cstddef>, se la versione di tale intestazione mette le definizioni nel namespace globale, così come std).

È ragionevole assumere sempre size_t == std :: size_t?

Sì. Tutti i tipi e le funzioni definite dalla libreria C sono compresi nel std spazio dei nomi, a patto che si include l'appropriato C++ di intestazione (ad esempio <cstddef> piuttosto che <stddef.h>)

Quando devo usare std :: _ :: size_type?

vuoi dire i size_type tipi definiti in alcune classi standard e modelli, come vector? Potresti usarli quando usi queste lezioni, se vuoi. Nella maggior parte dei casi, saprete che è lo stesso di size_t, così si potrebbe anche utilizzare tale e risparmiare un po 'di battitura. Se si sta scrivendo codice generico, in cui non si sa ciò che la classe è, allora è meglio usare size_type nel caso in cui non è compatibile con size_t.

Per esempio, si potrebbe desiderare di scrivere un contenitore progettato per contenere più oggetti di quelli possono essere rappresentati da size_t. È possibile utilizzare un tipo di tipo numerico grande per rappresentare la dimensione del contenitore, che non è convertibile in size_t.In tal caso, il codice come size_t s = c.size() non riuscirebbe a compilare - avresti invece bisogno di usare Container::size_type.

+0

Sul primo punto, posso usare size_t quando non ho incluso nulla. Per riferimento - sto usando VS2010. – David

+0

@Dave: Questa è presumibilmente un'estensione di Microsoft per il linguaggio: ce ne sono molti. Prova a compilare con estensioni di lingua disabilitate. –

+0

Hai ragione riguardo a cosa intendevo per 'std :: ____ :: size_type', ma puoi approfondire quando potrebbe essere 'incompatibile' con size_t, e la differenza tra ciò che rappresentano std :: size_t e :: size_type? – David

1

Da dove proviene size_t quando non ho nulla incluso in un progetto vuoto?

size_t è un tipo di meme intero senza segno base definito nella libreria standard di linguaggi C/C++. Si è definito in "stddef.h" per C e in <cstddef> per C++.

tipi definiti dal file di intestazione "stddef.h" si trovano nel namespace globale, mentre <cstddef> colpo di testa mette il tipo size_t nello spazio dei nomi std.

"stddef.h" da C è incluso in C++ per compatibilità, e quindi il tipo si trovano sia nel namespace globale (::size_t) e il std namespace (std::size_t).

0

size_t è definito in <cstddef> ed è nello spazio dei nomi std.

+3

Sarebbe bello (almeno per me imparare) se il downvoter ne spiega la ragione. – Sanish

Problemi correlati