2011-12-11 2 views
1

J'ai ce code, que je ne comprends pas pourquoi il ne compile pas:accès membres de la structure avec sizeof

typedef struct 
{ 
    uint32_t serial_number; 
    uint32_t ieee_address[6]; 
} FACTORY_CONFIG; 

... 
// Unlock flash (only the portion we write on) 
    error = FLASHD_Unlock (writeaddress, writeaddress + sizeof (FACTORY_CONFIG.serial_number), 0, 0); 

Quand je cours, je reçois cette erreur:

Error[Pe018]: expected a ")"

Quand je change le

FACTORY_CONFIG.serial_number

à

FACTORY_CONFIG

, il compile et tout fonctionne. Je ne suis pas sûr, puis-je vérifier la taille d'un type à l'intérieur d'une structure?

Répondre

3

Vous ne pouvez pas accéder aux membres des types en C comme ça. Vous pouvez cependant prendre sizeof à partir d'objets réels. Et puisque sizeof est une construction de compilation, ces objets n'ont même pas besoin d'être valides. Donc, ce qui suit fonctionnera:

sizeof(((FACTORY_CONFIG *)0)->serial_number) 

Si vous utilisez ce lot, ou tout simplement pour une meilleure lisibilité, vous pouvez faire une macro sortir.

+0

Comment ça marche, quel est le zéro? – stdcall

+0

Cela fonctionne car 'sizeof' peut calculer la taille des objets en inférant leurs types au moment de la compilation. Étant donné un pointeur f sur FOO, f-> member est un membre et le pointeur NULL (0) peut également être utilisé pour éviter de déclarer un pointeur temporaire. –

+0

-1 Il existe une macro 'offsetoff' dans la norme, exactement dans ce but. Cela prend en compte tous les problèmes de remplissage et est portable. Ne pas enseigner aux gens un tel hackery. –

0

Vous devez d'abord créer l'objet. La structure que vous créez est seulement un type. comme cela:

sizeof (((FACTORY_CONFIG *)0)->serial_number) 
0

Ce que vous semblez vouloir, ist d'interpréter votre writeaddress comme si elle pointe vers un objet de votre struct puis accédez à l'adresse du membre ieee_address.

La façon dont ces choses sont destinées à faire en C est

((FACTORY_CONFIG*)writeaddress)->ieee_address 

qui est tout.

La méthode que vous utilisiez est très dangereuse car vous ne savez pas comment votre compilateur mettra en struct en mémoire. Si vous devez, il y a la macro offsetof pour obtenir la position exacte d'un champ. BTW, ayant un alias de type dans toutes les majuscules est contre le style de codage commun et contre les habitudes de tout le monde. Habituellement, tous les noms de majuscules sont réservés aux macros.

Questions connexes