2017-04-19 76 views
0

创建阵列我用extern创建一个数组,但似乎它给我一个错误使用“的extern”在C

"undefined reference to `callback_Task'"

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

extern volatile callback_task callback[10]; 

现在,在C源文件

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

虽然编译它给出一个错误:

undefined reference to `callback' at 'test_task'

+0

您是否在'test.c'文件中包含'test.h'? – haccks

+1

'extern'关键字使其成为*声明*。你仍然需要一个*定义*。 –

+0

另外,你为什么使用'volatile'? –

回答

1

extern声明不会在任何地方创建数组。这只是编译器/链接器在某处寻找变量的一条指令。

你必须定义它,没有extern,在一些翻译单位,你会链接你的程序。

一个很好的候选人似乎是test.c,就像这样:

volatile callback_task callback[10]; 

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

是的。如果我删除extern,那么它的工作......但只是一个问题..如果我想在课堂以外使用,那么我需要让它extern ..对吗? –

+0

@JigneshPanchal - 我没有说从h文件中删除'extern'。我说要为c文件添加一条完全独立的行。 – StoryTeller

+1

@JigneshPanchal在C中没有类。 – Gerhardh

0

TL; DR这不是编译器,它是连接抱怨callback变量M.I.A.状态。


要精心,如下语句

extern volatile callback_task callback[10]; 

告诉 “某处存在” 可变callbackcallback_task [10]类型的编译器。这是一个“声明”,它不自己“定义”一个变量。所以,存在是“已知的”,而不是“被证明的”。

后来,虽然链接器正在搜索“实际”变量,但它没有得到一个,因此错误。