Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Vérification à la compilation

8 réponses
Avatar
Guillaume GOURDIN
Bonjour à tous,

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyé pas
des histoire de padding.

Est-il possible de faire des choses du style :

#if (sizeof(my_struct) != 4*sizeof(uint32_t))
#error "Invalid structure padding."
#endif

Merci pour votre aide.

- Guillaume -

8 réponses

Avatar
Kojak
Le Wed, 15 Oct 2008 11:45:20 +0200,
Guillaume GOURDIN a écrit :

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyà © pas
des histoire de padding.



Salut,

Je ne sais pas si c'est la réponse que tu attends, mais avec gcc,
l'option "-Wpadded" t'avertit si du padding est inclus dans ta
structure.

Cordialement,

--
Jacques.
Avatar
Marc Boyer
On 2008-10-15, Guillaume GOURDIN wrote:
Bonjour à tous,

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyé pas
des histoire de padding.

Est-il possible de faire des choses du style :

#if (sizeof(my_struct) != 4*sizeof(uint32_t))
#error "Invalid structure padding."
#endif



On peut.

static char verifie_que_mystruct_a_pas_padding[ sizeof(my_struct) == 4*sizeof(uint32_t) ];

On a pas le droit de définir un tableau avec une taille de 0, et la comparaison
retourne 0 ou 1...
Le static est juste là pour inciter le compilo à virer la variable vu
que personne ne va l'utiliser. Sinon, on a perdu quelques octets...

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)
Avatar
viza
On Wed, 15 Oct 2008 11:45:20 +0200, Guillaume GOURDIN wrote:

je voudrais m'assurer au moment de la compilation que la taille d'une
structure est bien celle que j'attends afin de ne pas être ennuyé pas
des histoire de padding.

Est-il possible de faire des choses du style :

#if (sizeof(my_struct) != 4*sizeof(uint32_t))
#error "Invalid structure padding."
#endif



sizeof n'est pas disponable au preprecesseur.
Avatar
ld
On 15 oct, 14:25, Marc Boyer wrote:
On 2008-10-15, Guillaume GOURDIN wrote:

> Bonjour à tous,

> je voudrais m'assurer au moment de la compilation que la taille d'une
> structure est bien celle que j'attends afin de ne pas être ennuyé p as
> des histoire de padding.

> Est-il possible de faire des choses du style :

> #if (sizeof(my_struct) != 4*sizeof(uint32_t))
> #error "Invalid structure padding."
> #endif

  On peut.

static char verifie_que_mystruct_a_pas_padding[ sizeof(my_struct) == 4*sizeof(uint32_t) ];

  On a pas le droit de définir un  tableau avec une taille de 0, et la comparaison
retourne 0 ou 1...
  Le static est juste là pour inciter le compilo à virer la variabl e vu
que personne ne va l'utiliser. Sinon, on a perdu quelques octets...



de meme que l'on ne peut pas representer 1/0 sur un entier.

enum { mystruct_a_du_padding = 1/(sizeof(my_struct) ==
4*sizeof(uint32_t)) };

n'utilise pas de place. C'est la base de mon static assert.

a+, ld.
Avatar
rixed
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break;
}
Avatar
Antoine Leca
En news:,
va escriure:
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break; }



C'est habile mais je ne ferais pas confiance aux compilateurs pour refuser
de compiler une telle construction (avec x==0), je suis certain qu'il ne
doit pas être difficile de rencontrer un compilo qui va certes donner
l'avertissement requis par la norme, mais va continuer quand même la
compilation, pensant qu'il s'agit « seulement » d'une étourderie de
programmation.

Les break sont inutiles (sauf peut-être pour éviter de recevoir des
tombereaux d'avertissements de la part de compilateurs pointilleux).


Antoine
Avatar
espie
In article <gda9j4$tr6$,
Antoine Leca wrote:
En news:,
va escriure:
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break; }



C'est habile mais je ne ferais pas confiance aux compilateurs pour refuser
de compiler une telle construction (avec x==0), je suis certain qu'il ne
doit pas être difficile de rencontrer un compilo qui va certes donner
l'avertissement requis par la norme, mais va continuer quand même la
compilation, pensant qu'il s'agit « seulement » d'une étourderie de
programmation.



Non, ca n'est pas un avertissement, c'est une erreur. Diagnostic requis
de toute implementation conforme.
Avatar
Antoine Leca
En news:gdacol$1bp1$, Marc Espie va escriure:
In article <gda9j4$tr6$,
Antoine Leca wrote:
En news:,
va escriure:
De même que l'on ne peut pas avoir deux fois zéro dans un switch :

#define COMPILE_ASSERT(x) switch(x) {
case 0: break;
case (x): break; }



C'est habile mais je ne ferais pas confiance aux compilateurs pour
refuser de compiler une telle construction (avec x==0), je suis
certain qu'il ne doit pas être difficile de rencontrer un compilo
qui va certes donner l'avertissement requis par la norme, mais va
continuer quand même la compilation, pensant qu'il s'agit
« seulement » d'une étourderie de programmation.



Non, ca n'est pas un avertissement, c'est une erreur. Diagnostic
requis de toute implementation conforme.



Désolé mais non : diagnostic requis signifie seulement que le compilateur
_doit_ émettre un message, cela ne signifie pas qu'il doit refuser de créer
le fichier objet (ce qui constitue la seule différence réelle entre un
avertissement et une erreur non fatale sur la plupart des compilateurs).
Donc émettre un avertissement est un diagnostic valable au sens de la norme.


Dans le genre, tu as en particulier les options '-pedantic', dont l'unique
objet est d'émettre les diagnostics requis par la norme, alors même que les
concepteurs du compilateur considèrent (à tort ou à raison, c'est un autre
débat) que le dit diagnostic est inutile : donc ils marquent le diagnostic
du sceau supposé infamant de la pédanterie, mais vont rarement jusqu'à
refuser de compiler le dit programme.

Ou alors il faudrait plutôt utiliser '-pedantic-error' ou '-Wx' mais ces
derniers ne sont PAS requis pour être conformes à la norme.


Antoine