2017-04-19 3 views
0

Je l'ai utilisé extern pour créer un tableau, mais il semble qu'il me donne une erreurEn utilisant 'extern' pour créer tableau en C

"undefined reference to `callback_Task'"

// test.h 
typedef struct { 
    uint32_t count; 
    uint32_t total; 
} callback_task; 

extern volatile callback_task callback[10]; 

maintenant dans le fichier source C

// test.c 
void test_task(void) { 
    callback[1].count = 1; 
    callback[1].total = 2; 
} 

While compiler son donner une erreur:

undefined reference to `callback' at 'test_task'

+0

Avez-vous inclus 'test.h' dans le fichier' test.c'? – haccks

+1

Le mot-clé 'extern' en fait une * déclaration *. Vous avez toujours besoin d'une * définition * quelque part. –

+0

Aussi, pourquoi utilisez-vous 'volatile '? –

Répondre

1

Une déclaration extern ne crée le tableau nulle part. C'est simplement une instruction au compilateur/éditeur de liens de chercher la variable quelque part.

Vous devez définir, sans extern, dans une unité de traduction avec laquelle vous liez votre programme.

Un bon candidat semble être test.c, comme ceci:

volatile callback_task callback[10]; 

void test_task(void) { 
    callback[1].count = 1; 
    callback[1].total = 2; 
} 
+0

Ouais. si j'enlève extern, alors son fonctionnement ... mais juste une question .. si je veux utiliser en dehors de la classe alors j'ai besoin de le faire extern .. pas vrai? –

+0

@JigneshPanchal - Je n'ai pas dit d'enlever 'extern' du fichier h. J'ai dit d'ajouter une ligne complètement indépendante au fichier c. – StoryTeller

+1

@JigneshPanchal il n'y a pas de classe en C. – Gerhardh

0

TL; DR Ce n'est pas le compilateur, il est l'éditeur de liens se plaindre de la M.i.a. variables callback statut.


Pour élaborer, une déclaration comme

extern volatile callback_task callback[10]; 

indique au compilateur que "quelque part, il existe" une callback variable de type callback_task [10]. C'est une "déclaration", elle ne "définit" pas une variable par elle-même. Ainsi, l'existence est "connue", pas "prouvée". Plus tard, alors que l'éditeur de liens recherche la variable "réelle", elle n'en obtient pas, et donc l'erreur.