web-dev-qa-db-ja.com

1つのファイルでC関数を定義し、別のファイルから呼び出すにはどうすればよいですか?

ファイルfunc1.cで関数を定義し、ファイルcall.cから関数を呼び出したいとしたら、どうすればよいでしょうか?前もって感謝します!

29
Sam H

関数の宣言をファイルに挿入しますfunc1.h、追加#include "func1.h" in call.c。次に、コンパイルまたはリンクfunc1.cおよびcall.c一緒に(詳細はどのCシステムに依存します)。

30
David Thornley

前方宣言 を使用します

例えば:

typedef struct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

Header Files と呼ばれるこれらの前方宣言を再利用できる機能があります。単純に前方宣言を取得し、ヘッダーファイルに配置してから、#includeを使用して、前方宣言を参照する各Cソースファイルに追加します。

/* SomeFunction.c */

#include "SomeReferencedFunction.h"

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

/* SomeReferencedFunction.h */

typedef SomeStruct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

/* SomeReferencedFunction.c */

/* Need to include SomeReferencedFunction.h, so we have the definition for SomeStruct */
#include "SomeReferencedFunction.h"

int SomeReferencedFunction(int someValue, SomeStruct someStructValue)
{
    if(someStructValue.SomeOtherMemberValue == NULL)
        return 0;

    return someValue * 12 + someStructValue.SomeMemberValue;
}

もちろん、両方のソースファイル、したがってライブラリまたは実行可能プログラム全体をコンパイルできるようにするには、両方の.cファイルの出力をリンカーコマンドラインに追加するか、同じ「プロジェクト」に含める必要があります( IDE /コンパイラに応じて)。

多くの人々は、あなたがそれらを必要とは思わないとしても、すべての前方宣言のヘッダーファイルを作成することを提案します。あなた(または他の人)がコードを変更し、関数の署名を変更すると、関数が前方宣言されているすべての場所を変更する時間を節約できます。また、いくつかの微妙なバグや、少なくとも紛らわしいコンパイラーエラーからあなたを救うのに役立つかもしれません。

12