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