在C中使用函数指针访问外部函数

在C中使用函数指针访问外部函数,c,function,pointers,extern,undeclared-identifier,C,Function,Pointers,Extern,Undeclared Identifier,我试图使用指向外部函数的指针链接到它。但每次尝试时,都会出现编译器错误,即extern函数未声明。我对外部功能几乎没有经验,因此看不出我的错误。我在lcd.c中声明了一个函数,我正试图从一个单独的文件memory.c中获取它 在编写仿真器时,我需要使用函数指针,并且我有一个内存地址数组,数组中的每个元素都链接到硬件函数,如果访问该内存地址,则调用该函数。基本上允许我做: UINT8 WriteMem(int address, UINT8 data) { return memo

我试图使用指向外部函数的指针链接到它。但每次尝试时,都会出现编译器错误,即extern函数未声明。我对外部功能几乎没有经验,因此看不出我的错误。我在lcd.c中声明了一个函数,我正试图从一个单独的文件memory.c中获取它

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

    UINT8 WriteMem(int address, UINT8 data) {
      return memory[address](data);
    }
这是我的代码,我有问题:

液晶显示器

液晶显示器

记忆

    #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,所以我把它缩减到了这一部分,如果你看一下
memory.c
gcc-ememory.c
)的预处理版本,我认为
LCD.h
中的
LCD\u dataline\R
的声明丢失了。这很可能是由于
lcd.h
中的一些
#if
#ifdef
#ifndef
造成的。我不知道您的程序有什么问题,但下面是一个可能重现类似错误的情况示例

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)

请显示您的
makefile
。您不需要显式使用
extern
@StefanoSanfilippo是的,默认情况下所有函数都是extern,但应该没有问题,通过显式声明函数为extern,请显示问题。如果您尝试在内存中使用lcd.h而不是lcd.c呢。o?我这样做了,事实证明这就是问题所在。我确实有一些预处理器代码,我把LCD拼错了,在我的一个ifdef中是LDC。真不敢相信这是一个如此简单的错误。现在一切都好了。谢谢大家的帮助。
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;
bar.c:3: error: 'foo' undeclared here (not in a function)