1. ホーム
  2. c

[解決済み】警告/エラー "関数宣言がプロトタイプでない" について

2022-02-21 23:02:06

質問

作成したライブラリがあります。

ファイル mylib.c:

#include <mylib.h>

int
testlib() {
    printf("Hello, World!\n");
    return (0);
}

ファイル mylib.h:

#include <stdio.h>
extern int testlib();

私のプログラムでは、このライブラリ関数を呼び出そうとしました。

ファイル マイプログラム.c :

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

このプログラムをコンパイルしようとすると、次のようなエラーが発生します。

myprogram.c:1 からインクルードされたファイルでは
mylib.h:2 warning: function declaration isn't a prototype (関数宣言がプロトタイプでない)

使っています。 gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

関数のプロトタイプを宣言する適切な方法は何ですか?

どのように解決するのですか?

Cの場合 int foo()int foo(void) は別の関数です。 int foo() は任意の数の引数を受け付けますが int foo(void) は引数0を受け付けます。C++では、これらは同じことを意味します。私は void 引数なしを意味する場合は、一貫して

もし、変数 a , extern int a; は、コンパイラに a は、別の翻訳ユニット(Cコンパイラがソースファイルのために言う)に存在する可能性のあるシンボルなので、リンク時まで解決しないでください。一方、関数名であるシンボルは、いずれにせよリンク時に解決される。関数上のストレージクラス指定子の意味( extern , static ) は、その可視性にのみ影響し extern はデフォルトなので extern は実は不要なのです。

を削除することを提案します。 extern これは余計なもので、通常は省略されます。