offset de compilation

Existe-t-il un moyen de trouver le décalage d’un membre d’une structure au moment de la compilation? Je souhaite créer une constante contenant le décalage d’un membre de la structure. Dans le code suivant, la macro offsetof() fonctionne dans la première instruction printf . Cependant, l’utilisation de la ligne 10 pour déclarer ofs génère l’erreur:

“Ne peut pas résoudre l’opérateur ‘->’ en tant qu’expression constante”.

Y a-t-il une autre façon de le faire?

 struct MyStruct { unsigned long lw; unsigned char c[5]; int i; int j; unsigned long last; }; const int ofs = offsetof(struct MyStruct, i); // This line in error int main(void) { printf("Offset of c = %d.\n", offsetof(struct MyStruct, c) ); printf("Offset of i = %d.\n", ofs ); return 0; } 

La macro offsetof () est une construction à la compilation. Il n’y a pas de moyen conforme à la norme pour le définir, mais chaque compilateur doit avoir un moyen de le faire.

Un exemple serait:

 #define offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) ) 

Bien qu’il ne s’agisse pas techniquement d’une construction au moment de la compilation (voir les commentaires de l’utilisateur “litb”), chaque compilateur doit avoir au moins une expression qu’il est capable de résoudre au moment de la compilation, ce qui correspond exactement à la offsetof() dans < stddef.h>.

Il y a probablement une autre erreur dans votre code – une inclusion manquante de ou une autre chose irritant votre compilateur.

Il comstack sans avertissement ici avec g ++ 4, après avoir ajouté le bon #includes.

Etes-vous inclus? Stddef.h? offsetof () est une macro et non un mot clé intégré en C.

Si cela ne résout pas le problème, essayez de rendre la constante statique, afin de la limiter au module. Cela pourrait rendre le compilateur heureux.

Si vous avez un #include comme je le suppose (le message d’erreur que vous citez sans signification n’aurait aucun sens), il s’agit d’un bogue dans votre compilateur. offsetof result est une expression constante entière en C99 ainsi qu’en C90.