Re: [gull] Subtilité de C n° 3 : l'opérateur sizeof
Marc Mongenet
marc at mongenet.ch
Mon Apr 7 12:29:33 CEST 2008
Le 04/04/08, Leopoldo Ghielmetti<leopoldo.ghielmetti at a3.epfl.ch> a écrit :
>
>
> > Fichier f3.c
> > ------
> > #if sizeof(int) == 4
> > #define SIZEINT 4
> > #else
> > #define SIZEINT (-1)
> > #endif
> > const int i = SIZEINT;
> > ------
> > marc> gcc -c f3.c
> >
> > Que me dit le compilateur ?
>
>
> f3.c:1:11: error: missing binary operator before token "("
>
> Le préprocesseur ne connaît pas d'opérateur sizeof! Ce qui me semble
> tout à fait normal car c'est un opérateur C.
Tout à fait.
D'où l'implémentation très subtile de la macro BUILD_BUG_ON
qu'on trouve dans le noyau Linux, et qui est utilisable pour causer
une erreur de compilation en cas de taille incorrecte d'un type.
Exemple d'usage :
BUILD_BUG_ON((sizeof(fi->newareas)*8) != NUM_LOW_AREAS);
L'implémentation :
/* Force a compilation error if condition is true */
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
Note : Ça revient à (void)sizeof(char[-1]) si la condition est vraie,
d'où l'erreur de compilation à cause de la taille de table négative.
--
Marc Mongenet
Creator of the Web 2 Markup Language
http://w2ml.com
More information about the gull
mailing list