2010-05-12 6 views
2

Dans mon fichier MyConstants.h ... J'ai:tableau global Objective-C de ints ne fonctionne pas comme prévu

int abc[3]; 

Dans mon fichier MyConstants.m correspondant ... je:

extern int abc[3] = {11, 22, 33}; 

Dans chacun de mes autres fichiers * .m ... Je

#import "MyConstants.h" 

intérieur 1 de mes méthodes viewDidLoad {}, j'ai:

extern int abc[]; 
NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int)); 

Pourquoi affiche-t-il "abc = (0) (3)" au lieu de "abc = (22) (3)"?

Comment faire pour que cela fonctionne comme prévu?

+4

Est-ce que 'extern' ne devrait pas aller dans le fichier .h au lieu de .m? – squelart

+0

@squelart: faites-en une réponse. –

+0

@squelart: D'oh, désolé, je ne voulais pas voler votre tonnerre. Je vais mettre à l'eau votre réponse si vous en ajoutez une et retirez la mienne. – dreamlax

Répondre

5

Le extern doit figurer dans la déclaration de l'en-tête, et non dans la définition du fichier source. extern indique au compilateur que le symbole existe ailleurs, il peut ou non être dans la même unité de traduction. C'est le travail de l'éditeur de liens de s'assurer que tous les symboles déclarés ont été réellement définis.

Constantes tête (MyConstants.h):

extern int abc[3]; 

Constantes Source (MyConstants.m):

int abc[3] = {11, 22, 33}; 

Autre Source (SomeFile.m):

#include "MyConstants.h" 
... 
- (void) someMethod 
{ 
    NSLog (@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(int)); 
} 

En outre, notez que lorsque la mesure de la taille d'un tableau, il est moins sujet aux erreurs de diviser par t la taille du premier élément, de sorte que si le type de abc change (c.-à-d. de int à double), les résultats sont toujours valables.

- (void) someMethod 
{ 
    NSLog(@"abc = (%d) (%d)", abc[1], sizeof(abc)/sizeof(abc[0])); 
}