2009-12-06 11 views
8

私はこのような形式にほぼすべてのCマクロを参照してください理由として興味:Cマクロ/#インデントを定義しますか?

#ifndef FOO 
# define FOO 
#endif 

またはこの:

#ifndef FOO 
#define FOO 
#endif 

しかし決してこの:

#ifndef FOO 
    #define FOO 
#endif 

(しかも、vimの年代=演算子は正しいものとして最初の2つを数えるように見えます)。

これはコンパイラ間の移植性の問題によるのですか、それとも単なる習慣ですか?

答えて

4

IIRCでは、旧式のCプリプロセッサでは、ライン上の最初の文字を#にする必要がありました(ただし、この要件を満たすものは実際には見つかりませんでした)。

最初の例のようなコードは見たことがありません。私は通常、2番目の例のようにプリプロセッサディレクティブを書きました。私はそれが視覚的に実際のコードのインデントを少なくしていることを発見しました(私がC言語でこれ以上書くことはありません)。

GNU C Preprocessor manualは言う:

前処理ディレクティブは、 '#' で始まる あなたのプログラム内の行です。 の前後に空白を入れることができます。私はそれがすべての3つの方法を行って見てきました

+0

さらに、編集者は、プリプロセッサの条件付きブロックをどのようにインデントするか(またはインデントしない)かについての独自の考えを持つことが多いという疑問があります。 –

+1

旧VAX Cコンパイラ(1986年頃)は、プリプロセッサ・ディレクティブが最初のカラムに '#'を持たないとエラーをスローします。 –

7

、通常2番目の例では、最も一般的であるが、私は最初の例を見てきたスタイルの、ない構文

の問題のようです(または3番目の)は、#ifdefの複数のレベルを区別するのに役立ちます。論理が深く入れ子になることがあり、一見してそれを理解する唯一の方法は、{と}の間のコードブロックをインデントするのが一般的なようにインデントを使用することです。

1

プリプロセッサディレクティブは、実際にはプログラムステートメントではなく、プリプロセッサのディレクティブです。これらの行の前には常にハッシュ記号(#)が付きます。 '#'の前後に空白を入れることができます。改行文字が見つかるとすぐに、プリプロセッサ・ディレクティブは終了するとみなされます。

C/C++の標準とは別のルールはありませんので、スタイルと可読性の問題として残っています。私はあなたが投稿した2番目の方法でしか見たり書いたりしませんでした。より読みやすいようです。

3

私は2番目のスタイルを使用するインクルードガードを除いて、3番目のスタイルを使用します。

は、私はすべての最初のスタイルが好きではない - 私は#define考えるプリプロセッサ命令であるとして、実際のコースになっていないにもかかわらず、それはプリプロセッサ命令define続く#です。しかし、私はそれをそのように考えるので、それらを分けるのは間違っているようです。私は、そのスタイルを主張する人々によって書かれたテキストエディタが、そのスタイルで書かれたコードに作用するブロックインデント/アンインデントを持つことを期待しています。しかし、私はそれをしないテキストエディタを使用してそれに遭遇することは嫌です。

古代のプリプロセッサには、ラインの最初の文字でなければならないポイントはありません。頭を上に置いて、それらの実装と標準Cとの間の他の相違点をすべて避けることができない場合は避けてください他のものは、おそらく彼らがサポートしないことをすることができます。もちろん、もしあなたが真にプレスタンダードコンパイラを使って作業しているのであれば、十分です。

関連する問題