Cプログラムの1つに#includeできるヘッダーファイルに関数のコレクションを作成できるようにしたいと思います。
できました。
例whatthing.h
#ifndef WHATEVER_H_INCLUDED
#define WHATEVER_H_INCLUDED
int f(int a);
#endif
注:lukeのおかげでガード(プリプロセッサコマンド)が追加されました。同じコンパイルに同じヘッダーファイルを2回含めることは避けられます。別の可能性(コメントにも記載されています)は#pragma once
を追加することですが、すべてのコンパイラでサポートされる保証はありません。
例whatever.c
#include "whatever.h"
int f(int a) { return a + 1; }
そして、「whatever.h」を他の.cファイルに含めて、whatever.cのオブジェクトファイルとリンクできます。
このような:
sample.c
#include "whatever.h"
int main(int argc, char **argv)
{
printf("%d\n", f(2)); /* prints 3 */
return 0;
}
コンパイルするには(GCCを使用する場合):
$ gcc -c whatever.c -o whatever.o
$ gcc -c sample.c -o sample.o
ファイルをリンクして実行可能ファイルを作成するには:
$ gcc sample.o whatever.o -o sample
サンプルをテストできます:
$ ./sample
3
$
ヘッダーファイルは、コンパイル前にプリプロセッサによってコンパイルユニットに挿入されるため、有効なCコードを含めることができます。
ヘッダーファイルに関数が含まれ、複数の.c
ファイルに含まれている場合、各.c
ファイルはその関数のコピーを取得し、そのシンボルを作成します。リンカは、シンボルの重複について文句を言います。
技術的には、ヘッダーファイルにstatic
関数を作成して、複数の.c
ファイルに含めることができます。ただし、これは、コードが.c
ファイルにあり、宣言が.h
ファイルにあるという規則に違反するため、通常は行われません。
詳細については、 C/C++:ヘッダーファイルの静的関数、それはどういう意味ですか? の説明を参照してください。