Newsgroup: it.comp.lang.c++
Titolo: size_t e BCC 5.5

Come mai con in BCC 5.5 se includo l'header
<cstddef>
size_t non è definita?
(mentre lo è se includo l'header <stddef> ??)
Forse size_t è definito nel namespace std?
(infatti std::size_t funziona).
L'origine di questo mio dubbio è come al solito la libreria
bacata del BCC 5.5.
Infatti quando includo header standard tipo <vector>, size_t
è accessibile dal namespace globale!
Manlio Perillo

Manlio,
ti consiglio caldamente di proporre questo tipo di quesiti sul gruppo
borland.public.cppbuilder.language, servito ad esempio da
forums.borland.com
 .
Li' trovi alcuni esperti che combinano competenze sul linguaggio
standard con le peculiarita' di BCC.
Non perche' considero la tua domanda OT, quanto perche' mi pare piu'
probabile che trovi risposte esaurienti e perche' penso che la comunita'
degli utenti Borland ne trarrebbe profitto.
Ciao,
Nicola


Credo che quando riuscirò a capire come sottoscrivere lo farò.
Comunque quello che in pratica volevo sapere (a parte la
polemica sul BCC 5.5) è se size_t è definito nel namespace std o no.
Grazie  Manlio Perillo

Attenzione che questi gruppi sono gestiti direttamente dalla Borland e
vanno acceduti dai loro server, non dai normali ISP. I server che
conosco sono 
forums.borland.com
 (che sto usando) e
newsgroups.borland.com
.
Ciao,
Nicola

 è accessibile dal namespace globale!
Che credo sia un errore. Comunque mi pare che il problema sia
all'interno di rw\stddefs.h (incluso da vector.h) nel quale trovi il
seguente codice:
#ifndef _RWSTD_NO_NEW_HEADER
#include <cstddef>              /* Looking for size_t */
#else
#include <stddef.h>             /* Looking for size_t */
#endif
L'include giusto dovrebbe essere il primo che dichiara size_t nel
namespace std mentre evidentemente viene usato il secondo che dichiara
size_t nel namespace globale.
EMG

 #ifndef _RWSTD_NO_NEW_HEADER
significa "se non è definita la macro che indica che non sono
           presenti i nuovi header"
Credo che il problema sia più profondo.
Da qualche parte deve essere incluso l'header
stddef.h
Ad esempio nelle applicazioni per console sono inclusi
implicitamente moltissimi header.
Credo che questa 'contaminazione' del namespace globale
sia irrimediabile.
D'altronde anche il KAI C++ soffre di questo problema.
E' il prezzo da pagare per avere compilatori C++ sviluppati
sopra compilatori C.
Credo che mai nessuno implementarà un compilatore C++ ex-novo
con una libreria C scritta per il C++.
Inoltre lo Standard indica che alcuni nomi debbano essere
delle macro...
Manlio Perillo

 stddef.h
Certo, non lo vedi? Nel ramo #else. Anche nel ramo #ifndef ma attraverso
cstddef che dovrebbe attivare il namespace std.
EMG


Mi dispiace, proprio non riesco a seguirti.
Comunque size_t (se includo <vector>) è presente sia nel namespace
std che nel namespace globale.
Manlio Perillo

                                     ^^^ forse ti sei confuso
Scusa, ho fatto un casino. Ricominciamo da capo. Ho scritto il seguente
codice
#include <stddef.h>
int main()
{
    size_t n;
}
che compila regolarmente (a parte il warning sul non utilizzo di n) ma
non compila se metto std:: davanti a size_t. Poi ho scritto
#include <cstddef>
int main()
{
    std::size_t n;
}
che compila anch'esso regolarmente ma non compila se levo std::. Quindi
con questi due include stiamo a posto, giusto? Ora passiamo a
#include <vector>
int main()
{
    std::size_t n;
}
Questo compila sia con che senza std::. Quindi sono andato a guardare in
vector.h ed ho visto che viene definito sia un size_t all'interno del
namespace std e sia, tramite l'inclusione di rw\stddefs.h che a sua
volta include stddef.h, nel namespace globale.
E' risolto l'arcano ora?
EMG

 non compila se metto std:: davanti a size_t. Poi ho scritto
Questo e' un errore.  L'header <stddef.h> dovrebbe dichiarare 
gli identificatori sia nel namespace std che nel namespace
globale.
	Mauro


Ho dato una occhiata a rw\stddefs.
Ecco cosa fa (e non so se è Standard compliant):
#ifndef _RWSTD_NO_NEW_HEADER
#include <cstddef>  /* Looking for size_t */
#else
#include <stddef.h>  /* Looking for size_t */
#endif
#ifndef _RWSTD_NO_NEW_HEADER
#ifndef _RWSTD_NO_NAMESPACE
using std::size_t;
using std::ptrdiff_t;
#endif
#endif
Quindi in pratica (nel nostro caso):
#include <cstddef>  // (pone size_t in std)
using std::size_t   // (lo rende disponibile nel namespace globale)
E' questo quello che stavi dicendo?
Manlio Perillo

 globale.
Davvero? Lo dice lo standard? Se č cosě allora i problemi al riguardo
nel BCC55 sono piů di uno... :-(
EMG

 E' questo quello che stavi dicendo?
Avevo fatto ancora casino ma il risultato è quello. :-)
EMG
PS. Mi sa che non ci sto con la testa...