2012-09-19 13 views
12

Ora sto parlando di una nuova definizione di tipo da parte di un programmatore che utilizza la parola chiave typedef. Fino a quando i miei allievi sono utilizzati per il tipo size_t (ad esempio, utilizzando la lunghezza funciton()), per il quale ho dovuto chiedere loro un piccolo sforzo per solo "credere" si tratta di un tipo intero, penso che woud essere grande per mostra di nuovo loro dove questo tipo è definito.Dove C++ size_t è definito in linux

Così, ho fatto un sacco grep di in/usr/include in una casella di Ubuntu, e quello che vedo è che size_t è, a sua volta, una ridefinizione della size_type Wich a sua volta è una ridefinizione della METADATA_TYPE, e questo è la fine in questa directory. Non trovato l'ultimo "typedef unsigned int metadata_type;".

in/usr/src ho trovato anohter tipo precedente chiamato yy_size_t, ...

Ma, in ogni caso, sono stato in grado l'arrivare alla fine della catena.

Qualcuno sa dove trovare la definizione finale per verificare che si tratta di un int unsigned (o simile)? Forse mi manca un pacchetto di sviluppo nella mia scatola? In questo caso, perché sono in grado di compilare programmi utilizzando il tipo size_t?

+0

Provare un grep ricorsivo: "grep -r" – Brady

+0

possibile duplicato di [std :: size_t vs size_t vs std :: ____ :: size_type] (http://stackoverflow.com/questions/8507851/stdsize-t- vs-size-t-vs-std-size-type) – trojanfoe

+0

@Brady: 'sudo apt-get install ack-grep' –

risposta

21

Si può cercare di espandere la serie includere i file con il preprocessore C (cpp) a mano e verificare l'output di che:

$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c 

troverete che l'uscita del cpp comprende anche marcatori per indicare da cui file il codice in stdlib-expanded.c è stato incluso.

+2

+1 solo "echo" #include "| cpp -I/usr/include | grep size_t' fornisce 'typedef long unsigned int size_t;' come prima riga – stijn

+0

grazie per il tuo aiuto –

+0

echo '#include ' | cpp -I/usr/include | grep size_t HA FATTO IL TRUCCO. GRAZIE! – user2548100

3

Come altri hanno scritto, probabilmente lo puoi trovare se cerchi tutti i file di inclusione. Tuttavia il fatto che questo è il modo in cui la maggior parte delle implementazioni funziona non è garantito.

Lo standard dice che, ad esempio, #include <stddef.h> dovrebbe fornire una definizione per size_t che deve essere un tipo di numero intero senza segno. Ma anche si dice che non c'è bisogno di un file chiamato stddef.h di esistere in qualsiasi punto del file system. E anche un'implementazione che fornisce un tale file ma che file contiene solo la riga seguente

#pragma stdlib_stddef_h 

sarebbe perfettamente conforme se quanto precede pragma fornisce efficacemente ciò che la norma prescrive per tale intestazione.

In altre parole, size_t è un tipo intero senza segno perché è quello che dice lo standard, non perché è ciò che è possibile leggere in un file di intestazione.

3

Solo per completezza, hai considerato semplicemente di chiedere C++ su size_t?

#include <iostream> 
#include <cstddef> 
#include <limits> 

int main() 
{ 
    std::cout << "sizeof(size_t) = " << sizeof(std::size_t) << std::endl; 
    std::cout << "is size_t an integer? " << 
     (std::numeric_limits<std::size_t>::is_integer ? "yes" : "no") 
     << std::endl; 
    std::cout << "is size_t signed? " << 
     (std::numeric_limits<std::size_t>::is_signed ? "yes" : "no") 
     << std::endl; 
} 

mi dà

sizeof(size_t) = 8 
is size_t an integer? yes 
is size_t signed? no 
5

gcc fornisce alcune delle intestazioni e che è rilevante qui: size_t è definito in stddef.h, che è uno di quei intestazioni. Qui è ad esempio a /usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h.C'è la definizione di size_t è

typedef __SIZE_TYPE__ size_t; 

__SIZE_TYPE__ è una macro predefinita compilatore (che consente di garantire che il compilatore e l'intestazione d'accordo e, come quello che il compilatore aspettarsi dipenderà dai suoi argomenti - per esempio con -m32 esso è un bit a 32 bit senza segno e con -m64 un tipo a 64 bit senza segno -, per avere l'intestazione indipendente dagli argomenti del compilatore).