2012-02-24 13 views
0

私は現在、C(Javaから来た)プログラミング言語を学んでいます。マクロを定義する方法については少し混乱しています。Cヘッダーファイルの定義を使用していますか?

他のコードでマクロを使用するには、ヘッダーファイルにそのマクロが含まれている必要があります。しかし、ヘッダファイルにマクロを定義すると、ソースファイルはそれを使用できません。私はそれを両方で定義する必要がありますか、またはソースファイルのヘッダファイルを#includeする必要がありますか?

+0

素早く回答いただきありがとうございます! – bgroenks

答えて

6

ソースファイル実質的に常にには、ソースファイルに定義されている関数を宣言するヘッダーファイルが含まれています。関数を実際に定義する前に関数を宣言することは完全に合法であり、しばしば望ましいことです。ヘッダーが誤って不一致の場合、コンパイルエラーが発生する可能性があります。

+0

ありがとう!ソースファイルが独自のヘッダーを宣言するかどうかはわかりませんでした。 – bgroenks

+0

@ ghostsoldier23ソースファイルは独自のヘッダを宣言しません。キーコンセプトは「翻訳単位」です。それはあなたが深い理解のために調べなければならないものです。ヘッダー/インプットファイルのデュアルシップを信じているあなたのC経験を開始しないでください。合意した、時々起こる、時にはそれは必要なのだが、それは一般的なルールではない。 –

+0

@LuchianGrigore私は、宣言しないことを意味しました。ごめんなさい。それはその声明を明確にしていますか? – bgroenks

3

あなたは、ヘッダーまたは実装ファイルの両方で、それを定義することができますが、それはあなたがそれを使用する翻訳単位に見えるようにする必要があります。

それは単に1つの実装ファイル内で使用するためだ場合は、その中でそれを定義ファイルのみ。

さらに多くのファイルでマクロが使用されている場合は、そのマクロをヘッダーに定義し、マクロが必要な場所にそのヘッダーを含めます。

6

最初の#includeは、基本的にファイルに直接ファイルを挿入するのと同じです。これは、コンパイラの前に実行されるコンパイラプリプロセッサによって実行されます。詳細はGoogleのCプリプロセッサ...

は通常、セットアップは次のとおりです。

#include "macros.h" 

    ... 

    printf("Macro value %d\n", MACRO_HERE(1)); 

とあなたのヘッダファイルで

、macros.h

#ifndef MACROS_H_ 
    #define MACROS_H_ 

    #define MACRO_HERE(n) (n + 1) 

    #endif 

ラップの#ifdef(S)マクロを防ぎます後でマクロファイルを含む別のインクルードファイルがある場合は再定義されない

も参照してください:#pragma once(多くのコンパイラで広く使用されています)

+1

"_ +大文字"で始まる識別子は使用しないでください。これらの識別子は言語の実装者用に予約されています。また、#includeを使用して独自のファイルを引用符で囲む場合、システムヘッダファイルには< >が使用されます。それとは別に、この例は良いです。 +1 – Lindydancer

+0

@Lindydance - ありがとう、良い点。 – EdH

関連する問題