2013-05-13 41 views
0

所以我有这个非常简单的程序,但我似乎无法摆脱一个简单的错误。未定义的引用“功能”

我有这个

#ifndef FUNCTIONLOOKUP_H_INCLUDED 
    #define FUNCTIONLOOKUP_H_INCLUDED 


    enum functions 
    { 
     foo, 
     bar 
    }; 

    //predefined function list 
    int lookUpFunction(enum functions); 

    #endif // FUNCTIONLOOKUP_H_INCLUDED 

一个头文件,并在src的文件,我有lookUpFunction

现在的定义,当我打电话的lookUpFunction()从我的主,我包含头文件它给了我一个未定义的参考。其他awnsered问题没有帮助。

#include <stdio.h> 
    #include <stdlib.h> 
    #include "FunctionLookUp.h" 

    int main() 
    { 
    lookUpFunction(foo); <--- 
    return 0; 
    } 

功能实现

#include <stdio.h> 
    #include "FunctionLookUp.h" 

    typedef void (*FunctionCallback)(int); 
    FunctionCallback functionList[] = {&foo, &bar}; 

    void foo(int i) 
    { 
    printf("foo: %d", i); 
    } 

    void bar(int i) 
    { 
    printf("bar: %d", i); 
    } 

    int lookUpFunction(enum functions) 
    { 
    int test = 2; 

    //check if function ID is valid 
    if(functions >= sizeof(functionList)) 
    { 
     printf("Invalid function id"); // error handling 
     return 0; 
    } 

    //call function 
    functionList[functions](test); 
    return 1; 
    } 

我似乎无法找出在这个错误的来源。

+0

你需要用'FunctionLookup.o'链接,或添加'FunctionLookup.c'编译器调用。 – 2013-05-13 11:26:38

+2

不要单独定义'false','true'。现代C应该在头文件'stdbool.h'中提供它们。如果(但是请不要除非你有真正的理由)以相反的方式定义它们,以便自然地用C表示,即'0'是错误的,并且非零值是真的。这里有'true == 0'和'false == 1'。 – 2013-05-13 11:29:56

+0

Daniel Fischer:我使用codeblocks作为编辑器,之前从未遇到过这个问题,而我制作了一打这些程序。它是如何突然不得不改变的东西 Jens Gustedt:我知道已经删除它;) – flexzican 2013-05-13 11:32:21

回答

0

你永远不会显示代码实现的功能。

所以最有可能的是你看到的是链接器错误,调用本身很好,但链接器找不到要调用的代码,所以会引发错误。

只是声明一个函数不能神奇地使它从某处出现,你也必须写实际函数。

+0

就像我说的,我把它写在FunctionLookUp.c中的代码在那里工作。 – flexzican 2013-05-13 11:33:37

1

你必须有一些类似的文件:

/* FunctionLookUp.c */ 
#include "FunctionLookUp.h" 

int lookUpFunction(enum functions) 
{ 
    /* code ... */ 
    return x; 
} 

以地方为您解决问题

+0

我有,我会粘贴它,因为这可能不清楚 – flexzican 2013-05-13 11:37:26

+0

所有似乎对我来说是正确的(看到你的编辑后),如果你想获得更多的帮助显示你的Makefile或告诉我们你如何调用gcc加上完整错误消息 – 2013-05-13 11:48:22

+0

Codeblocks生成make文件,是啊,这就是为什么这是如此的困扰我 – flexzican 2013-05-13 12:06:32