2

ポインターを使用してextern関数にリンクしようとしています。しかし、試行するたびに、extern 関数が宣言されていないというコンパイラ エラーが発生します。私は外部関数の経験がほとんどないため、自分の間違いを見ることができません。別のファイルmemory.cから取得しようとしているlcd.cで宣言された関数があります。

エミュレーターを作成するときに関数ポインターを使用する必要があり、メモリ アドレスの配列があり、そのメモリ アドレスがアクセスされた場合に呼び出されるハードウェア関数に配列の各要素がリンクされます。基本的に私にできること:

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

私のコードは次のような問題を抱えています:

液晶.c

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

lcd.h

    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

プログラムの何が問題なのかはわかりませんが、同様のエラーを再現する可能性のある状況の例を次に示します。

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 に答える