2012-05-09 7 views
9

私は幾分か#defineステートメントで混乱しています。図書館では、彼らは#ifdefsと#ifndefsがたくさんある異なるファイル間のコミュニケーションの手段であるようです。C:#defineディレクティブはグローバルですか?

file2.cの2つのファイルがまとめられていて、#define TEST 10file2.cの中にあります。

'TEST' undeclared (first use in this function) 

#defineディレクティブはグローバルです:私はfile2.c内部TESTを使用する場合しかし、コンパイラは、次のエラーメッセージを表示しますか?

+0

どこに定義されているかによって異なります。 – Nick

+0

'#define'はプリプロセッサディレクティブです。コンパイル時に単純なテキスト置換を行います。コンパイル単位と' #include'ファイルは '#define'を参照します。 –

答えて

13

#define sがグローバルではありません(同じコンパイル単位で宣言されている場合)、彼らが使用されているこれまでの単なる置換されている

彼らはないグローバルあり、彼らはないシンボルであり、彼らはです関連性のないのリンケージでは、の事前編集にのみ関連しています。

+0

"コンパイルユニット"とはどういう意味ですか? 'file1.c'と' file.2'を同じコンパイル単位でどのように使うことができますか? – Randomblue

+1

いいえ、それらは別々にコンパイルされます。そして一緒にリンクされた鶏。あなたはCのビルドプロセスに精通していますか? – MByD

+0

'file1.c'と' file2.c'は決して同じコンパイル単位にありませんか? – Randomblue

4

#define dマクロは、通常のCスコープ規則に従わないという点でグローバルです。マクロからのテキスト置換が(ほぼ)に適用されます#defineの後にマクロ名が表示されます。

ヘッダーファイルにマクロを定義した場合、そのヘッダーファイルを持つファイルはすべて、そのマクロを継承します(これらのマクロは、マクロを継承するかどうかは関係ありません。それが明白にそれを#undefで定義解除しない限り)。

例では、file2.cTESTマクロについてはわかりません。 file1.cから#defineを受け取る方法をどのように知っていますか?魔法で?マクロはソースコード上でテキスト置換を実行するため、生成されたオブジェクトファイルにはマクロの表現がありません。したがって、#defineは、共通のヘッダーファイル(.cファイル#include)に存在する必要があります。file2.cは、その置換ルール自体を知る必要があります。

あなたは、それらの多くは、おそらくコンパイル環境によって提供さ事前に定義されたマクロ名に対してチェックされているどのように多くのあなたが仕事のライブラリに表示さ#ifdef秒程度、特に求めている場合。たとえば、C99コンパイラは言語バージョンを指定する__STDC_VERSION__マクロを定義します。 Microsoftコンパイラは_MSC_VERマクロを定義します。ほとんどのコンパイラでは、単純なマクロをコマンドライン引数として定義することもできます。たとえば、コードgcc -DNDEBUG file1.cを使用してコードをコンパイルして、を無効にしてNDEBUGを定義してfile.cをコンパイルします。

+0

有用な情報のためのThx – Hydro

1

あなたはfile1.hを作成し、そこに定義する必要があります。それからfile2で。Cパイとして簡単

#include "file1.h" 

:)

0

ケースの誰かが、この後の読み込み、およびいくつかの実用的な情報を追加するには:

  • にアトメル、対、またはIARのような一部の環境を、あなたを許しますグローバルな#defineディレクティブを定義します。基本的には、これらの定義された値をコマンドライン形式でプリコンパイラに渡します。
  • 同じことをバッチコマンドやメイクファイルなどで行うことができます。
  • Arduinoは、常にボードのバリアント(通常はhardware \ arduino \ variantにあります)をすべてのコンパイルに追加します。その時点で、グローバル定義ディレクティブを含む新しいボードを作成し、そのように使用することができます。たとえば、いくつかのデバッグ・ディレクティブを含むオリジナルのmega2560からmega2560(デバッグ)ボードを定義することができます。 "boards.txt"にその変種への参照を追加し、テキストをコピーして適切に変更してコピーします。

最後に、グローバルhfileまたはグローバルディレクティブをコンパイラに何らかの形で与える必要があります。

関連する問題