2

我试图使用指向它的指针链接到外部函数。但是每次我尝试时,我都会收到编译器错误,即 extern 函数未声明。我对外部函数的经验很少,所以看不到我的错误。我在 lcd.c 中声明了一个函数,我试图从一个单独的文件 memory.c 中获取该函数。

我在编写模拟器时需要使用函数指针,并且我有一个内存地址数组,其中数组的每个元素都链接到访问该内存地址时调用的硬件函数。基本上允许我这样做:

    UINT8 WriteMem(int address, UINT8 data) {
      return memory[address](data);
    }

这是我的代码我遇到的问题:

液晶显示器

    UINT8 LCD_dataline_R(UINT8 data) {
      // Some code
      return aValue;
    }

液晶显示器

    extern UINT8 LCD_dataline_R(UINT8 data);

内存.c

    #include "lcd.h"
    typedef UINT8 (*MemFunct)(UINT8 data);
    MemFunct ReadDataLine = LCD_dataline_R;
    .
    .
    UINT8 recieved = ReadDataLine(0x80);

我在 Linux Mint 上使用 GCC 编译代码

并得到错误

    Running command: make -f makefile memory.o
    gcc -c -Wall memory.c
    memory.c:3:25: error: ‘LCD_dataline_R’ undeclared here (not in a function)

编辑

这是生成文件:

    CC=gcc
    CFLAGS=-Wall -std=c99 `sdl-config --cflags` `pkg-config --cflags gtk+-2.0`
    LIBS=`sdl-config --libs` `pkg-config --libs gtk+-2.0`

    all: psiora clean

    memory.o: memory.c psiora.c lcd.c
        $(CC) -c $(CFLAGS) $^

    clean:
        rm -rf *o psiora

我现在只是想编译memory.o,所以我把它缩减到了那部分

4

2 回答 2

0

我认为,如果您查看memory.c( ) 的预处理版本,则缺少fromgcc -E memory.c的声明。这很可能是由某些或在.LCD_dataline_Rlcd.h#if#ifdef#ifndeflcd.h

于 2013-05-11T11:29:01.957 回答
0

我不知道您的程序有什么问题,但这里有一个可能重现类似错误的示例。

foo.h:
extern void foo(int a);

foo.c:
#include "foo.h"
void foo(int a)
{    
}

bar.c:
//#include "foo.h"  --> Uncomment to remove error
typedef void(*fptr)(int a);
fptr fooptr=foo;

编译时,

gcc -c foo.c bar.c

我得到一个类似的错误:

bar.c:3: error: 'foo' undeclared here (not in a function)
于 2013-05-11T11:37:56.130 回答