0

ファイル「draw.h」に関数がありました:

void TileSystem() {
    // Some code here.        
}

そして、「main.c」ファイルで、ファイルに「draw.h」を #include したので、それを呼び出します。機能はうまく動作します!!

しかし、その後、関数の名前を次のように変更することにしました

void CreateTileSystem() {
    // Some code here.        
}

そして、次の出力が得られます。

gcc main.c -std=c99 -o main `pkg-config --cflags --libs allegro-5.0 allegro_acodec-5.0 allegro_audio-5.0 allegro_color-5.0 allegro_dialog-5.0 allegro_font-5.0 allegro_image-5.0 allegro_main-5.0 allegro_memfile-5.0 allegro_physfs-5.0 allegro_primitives-5.0 allegro_ttf-5.0`
main.c: In function ‘main’:
main.c:217:12: warning: implicit declaration of function ‘CreateTileSystem’ [-Wimplicit-function-declaration]
/tmp/cclNEg6q.o: In function `main':
main.c:(.text+0xb1e): undefined reference to `CreateTileSystem'
collect2: error: ld returned 1 exit status
make: *** [main] Error 1

そして、名前を TileSystem に戻すだけで、うまく機能します。コード全体で他の参照はありません。まったく意味がありません!関数で動詞を使用するために、名前を変更したいと思います(より「正しい」標準だと思います)。うーん、本当にどうなるか知りたいです。私は本当にエラーを見つけることができず、名前を変更すると元に戻るという事実は、私をさらにイライラさせます.

どうもありがとうございました!

4

3 に答える 3

1

ヘッダーファイルの名前も変更する必要がありますdraw.h

このエラー/警告は、関数の前方宣言がなかったことを示します。これは、古いC方言では、関数がint fn(int)(メモリが機能する場合)であると想定する結果になります。

ヘッダーが変更されていないため、元に戻すと機能します。そのため、古い名前の前方宣言が引き続き提供されます。

于 2013-02-01T03:35:22.520 に答える
0

ここで説明したようないくつかの単純なファイルを作成しようとしましたが、問題はありません。そう:

  • draw.h と main.c の両方で新しい関数に同じ名前を使用したことは確かですか?

  • allegro についてはわかりませんが、たまたま TileSystem という関数が含まれているのでしょうか?

それらを超えて、最低限のセットアップから始めることをお勧めします (つまり、インクルード、メイン関数、および main.c の呼び出しと、draw.h の宣言のみ) gcc main.c -std=c99 -o main。エラーが再び発生し始めるまで、アプリケーションを現在の状態に少しずつ戻します。これは、問題の原因を特定するのに役立ちます。

于 2013-02-01T03:47:08.560 に答える
0

何も変更せずにヘッダーファイルを再作成しましたが、うまくいきました。それは、私が決してファイルを変更しなかったことと関係がありました (つまり、ファイルの名前を変更したり、ファイルを除外したりしていました)。非常にアンダーグラウンドなコンパイルの問題が発生しました。

于 2013-02-01T04:00:13.970 に答える