2010-11-30 6 views
0

s'il vous plaît quelqu'un peut-il me aider à mettre en œuvre l'opérateur sizeof() dans c ..opérateur sizeof dans c

je sais que l'utilisation .. mais je n'a pas pu le mettre en œuvre.

+2

Qu'avez-vous essayé? Où êtes-vous coincé? Avez-vous des erreurs? Est-ce que vous écrivez un compilateur? –

+0

Non .. Je vais réellement mettre en œuvre le comportement de l'opérateur sizeof – RJV

+0

par exemple si la sortie de sizeof ('t') den est 1 – RJV

Répondre

10

Vous ne pouvez pas implémenter sizeof() en tant que fonction de bibliothèque, il s'agit d'un compilateur intrinsèque. Est-ce que vous écrivez un compilateur?

+0

par exemple si la sortie de sizeof ('t') den est 1 – RJV

+6

@RAVI JV: Il est peu probable que le résultat de 'sizeof ('t')' soit '1' sur votre ordinateur car une constante de caractère est de type' int 'en C, pas' char' (oui, 'int' _could_ peut être d'un octet si un octet a au moins 16 bits, il est peu probable que vous ayez un système où c'est le cas). –

+0

@James Etes-vous sûr de ça? Je suis assez sûr que 't' sera de type char qui est garanti à 8 octets ... –

1

Vous ne pouvez pas implémenter sizeof en C; c'est un opérateur de base (vous ne pouvez pas non plus implémenter +).

Vous pouvez écrire une macro qui a un sous-ensemble limité de comportement de sizeof, en faisant quelque chose le long des lignes de:

#define thisIsAHorribleHackDontDoThis(a) \ 
    ((size_t)((intptr_t)(&a + 1) - (intptr_t)&a)) 

mais qui ne fonctionne que si a est une lvalue (et il est horrible à voir). sizeof n'est pas si limité, et c'est pourquoi vous devriez l'utiliser au lieu de réinventer une roue qui n'est pas réellement ronde.

+1

Ou '#define mysizeof (type) ((taille_t) ((char *) ((type *) 0 + 1) - (char *) 0))' –

+0

@R: il faut mélanger vos deux approches pour être "maximum" portable". 'intptr_t' n'est pas nécessairement défini mais' (char *) (void *) & a' est. D'un autre côté, si je me souviens bien, faire de l'arithmétique sur des pointeurs NULL est UB. –

-2

est inférieure à la mise en œuvre de sizeof opérateur

#define SZOF(x) (size_t)(((x*)(0))+1) 
+0

qui ne fonctionne que pour certains * type * x; sizeof fonctionne également sur les noms de variables. Aussi, c'est à peu près la même chose que le commentaire de R. à la réponse de Stephen Canon, ci-dessus. –