Cで独自のヘッダーファイルを作成する


回答:


299

foo.h

#ifndef FOO_H_   /* Include guard */
#define FOO_H_

int foo(int x);  /* An example function declaration */

#endif // FOO_H_

foo.c

#include "foo.h"  /* Include the header (not strictly necessary here) */

int foo(int x)    /* Function definition */
{
    return x + 5;
}

main.c

#include <stdio.h>
#include "foo.h"  /* Include the header here, to obtain the function declaration */

int main(void)
{
    int y = foo(3);  /* Use the function here */
    printf("%d\n", y);
    return 0;
}

GCCを使用してコンパイルするには

gcc -o my_app main.c foo.c

2
@Anu:この形式では読みません。元の質問を編集して、このコードを含めることができます。
オリバーチャールズワース2011

3
ボタンだけでビルドしようとすると、このコードは機能しないことに注意してください(たとえば、Code :: Blocksの「ビルドして実行」)。それはあなたにとっては明白に思えるかもしれませんが、私にとってそれが起こったのは初めてであり、どこに問題があるのか​​を理解するのにかなりの時間がかかりました。
ジェイコモン2014年

5
@Jeyekomon:さて、問題どこにありますか?
オリバーチャールズワース2014年

2
「ビルドして実行」ボタンだけではすべてを実現できるとは誰も言わなかった。:-)それは私にとっては驚きでした(私は初心者です)。今、私は最初にコマンドラインまたはメイクファイルを使用することを学ぶ必要があると思います。
ジェイコモン2014年

1
必要なすべてのファイルを使用してコンパイルする方法を詳しく説明でき、foo.cをgccプログラムの引数に含める必要がないかどうか疑問に思っていました。この手法とは何ですか、またはIDEの外でこれを実現できるプログラムは何ですか
-Makeが

26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H 二重包含ガードとして機能します。

関数宣言の場合、次のように、シグネチャを定義するだけで済みます。つまり、パラメータ名は不要です。

int foo(char*);

本当に必要な場合は、パラメーターの識別子を含めることもできますが、識別子は関数の本体(実装)でのみ使用されるため、ヘッダー(パラメーターシグネチャ)の場合、識別子はありません。

これはaを受け入れてを返す関数を宣言します。foochar*int

ソースファイルでは、次のようになります。

#include "my_header.h"

int foo(char* name) {
   //do stuff
   return 0;
}

これらは、「関数ヘッダー」ではなく、関数宣言または関数プロトタイプとして知られています。ヘッダーは、含めるファイルであり、その中の宣言ではありません。
ジョナサンウェイクリー、

@JonathanWakelyこれらはヘッダーファイルです。名前はそれをすべて伝えます:ヘッダーファイルにはヘッダーが含まれています。しかし、フィードバックをありがとう、それは私に少し考えさせられました。
Flavius

いいえ、ヘッダーはファイル自体であり、ヘッダーに含まれる宣言ではありません。「ヘッダー」の使用をバックアップする信頼できる単一の参照を見つけることができますか?たとえば、K&R、C標準、UNIXプログラミング環境Wikipediaとは矛盾しています。
ジョナサンウェイクリー、

@JonathanWakelyあなたは実際にK&Rを読みましたか?TOCには「4.5ヘッダーファイル」というセクションがあり、「ヘッダーファイル」はイタリック体で表記され、用語を示しています。この本の残りの部分では、著者は簡潔にするために単に「ヘッダー」を書くことがありますが、書式設定とTOCを通じて、正しい用語が何であるかは明らかです。だから、プロになって、あなたが間違っていることを認識してください。
Flavius

はい。「ヘッダー」はファイルの宣言ではなくファイルを指します。第2版​​では、標準ヘッダーの説明については241ページを参照し、定義宣言(誤って「関数ヘッダー」と呼ぶ)について説明し、ヘッダーを明確に定義する33ページを参照してください。「通常extern、変数の宣言を収集して各ソースファイルの前にによってインクルードされる、これまではヘッダーと呼ばれていた別のファイル内#includeの関数。たとえば、標準ライブラリの関数は、などのヘッダーで宣言され<stdio.h>ます。
ジョナサンウェイクリー、

8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}

void function();宣言などの呼び出しを防ぐことはできませんfunction(42);。使用voidの宣言のようにvoid function(void);
回復モニカ- chux

5

ヘッダーファイルには、.cまたは.cpp / .cxxファイルで定義する関数のプロトタイプが含まれています(cまたはc ++を使用しているかどうかによって異なります)。#ifndef /#definesを.hコードの周囲に配置して、同じ.hをプログラムの異なる部分に2回インクルードした場合、プロトタイプが1回だけインクルードされるようにします。

client.h

#ifndef CLIENT_H
#define CLIENT_H

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize);


#endif /** CLIENT_H */

次に、.hを.cファイルに次のように実装します。

client.c

#include "client.h"

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize) {
 short ret = -1;
 //some implementation here
 return ret;
}

「プログラムの別の部分に同じ.hを2回組み込んだ場合、プロトタイプは1回しか含まれません。」これは誤解を招くものです。それらは同じソースファイルから同じヘッダーファイルを2回含めること(2つの異なるソースファイルに2回ヘッダーを含めることは問題なく、通常は必要です)を防ぎ、関数プロトタイプの再宣言は問題ではなく、型とグローバル変数を再定義します保護する必要があるものです。
ジョナサンウェイクリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.