2011-01-18 12 views
16

しばらく前に私はこのようなマクロをスキャンした(むしろ古代の)Cコンパイラ、(擬似コード)を発見した:プリプロセッサ命令は、行の先頭に置くべきですか?

if line.startswith("#include") or line.startswith("#define"): 
    ... 

...種類の、マクロが実際に置かれるべきである私のために問題を提起し、どのそのような、行の先頭に:

void stuff() 
{ 
#if defined(WIN32) || defined(_WIN32) 
    ... 
#else 
#if defined(__GNUC__) 
    ... 
#else 
    ... 
#endif 
#endif 
} 

というかのようなので(それが読みやすくするために、私はそれを行う方法だとして):

void stuff() 
{ 
    #if defined(WIN32) || defined(_WIN32) 
    ... 
    #else 
    # if defined(__GNUC__) 
    ... 
    # else 
    ... 
    # endif 
    #endif 
} 

プリプロセッサコードをインデントする方法は標準化されていますか?つまり、インデントされても同じ方法で動作しますか?

+5

擬似コードを愛してください。D。 「擬似コード」は素晴らしい言語です。 –

答えて

13

(例えば)#defineはと同一平面である必要はいくつかの古いCコンパイラ左マージン:あなたができるよう#は、左マージンであることだけである必要は

#define FOO bar 

他のCコンパイラ:

# define FOO bar 

新ER Cコンパイラは、任意の先頭の空白の後に#を受け入れる傾向にある:

#define FOO bar 

あなたは、このような古いコンパイラとの互換性が必要な場合は、少なくとも最初の列にあなたの#を置く必要があります。互換性が問題でなければ、それはあなた次第です。

私は通常、関数内に#ifdefブロックを埋め込まないようにしようとしています。そのため、インデントされるべきかどうかという疑問がほとんどなくなります。

+0

私はZetaCのようなコンパイラのサポートについて心配する必要はないと思いますが、これは幸いにもごく稀にしか使用されません;-) –

+0

「このような古いコンパイラとの互換性を望むなら、彼らはC99はもちろん、C89を実装していませんか? –

+0

あなたはANSI K&R v1より前のコンパイラを話しています。関数宣言とパラメータリストについては忘れてください。 – MSalters

-3

私は、コンパイラは前処理する前に、あなたがスペースを持っている場合は、「気」とは思わない - それは同じである必要があります...

+3

推測しないでください... –

2

いいえ、行の先頭にある必要はありませんが、空白(スペース、タブなど)を前に付けることができます。

通常、実際のCコードより前に前処理されているため、スコープの対象にならないため、行頭に配置されます。 gcc C preprocessor documentationから

+0

空白は '# 'の後に許されます。'#include 'のように –

+2

もちろんです。私は反対を述べていますか? – peoro

13

:プリプロセス指令

#'. Whitespace is allowed before and after the#」で始まる あなたのプログラム内の行です。

+0

@ウィル:引用文に2番目の文を追加する前に、おそらくこのコメントを書きました:) – davka

-1

重要ではありません。コードが識別されず、1行でコンパイルする必要がある場合(コード、プリプロセッサ/インクルードは別の行では別々の行が必要です)、このようにしてください。

編集:これは本当に古いコンパイラだと思われます。プリプロセッサは、他のコード以外のものと同様に、1行に含める必要があります。

+1

コードが1行にインデントされていないと、コンパイルできません。 –

+0

C#に固執する... –

+0

ええ、その部分を忘れてしまった。プリプロセッサは1行になければなりませんが(コードはありません)、これは問題ではありません。 – RvdK

関連する問題