2012-04-04 12 views
6

Cでは、ステートメントの終了を示すためにセミコロン(;)が使用されています。なぜ#include行はセミコロンを必要としませんか?なぜ#includeディレクティブにステートメントの最後にセミコロンがないのですか?

+2

これはCステートメントではないためです。これは、プリプロセッサへの指示(命令)です。 – wildplasser

+0

そのCの設計方法とC++の設計方法 – Surya

+0

@Surya:関連するコメントはありません回答を見ると思います –

答えて

12

#include(そして、#で始まる他のすべての行は、#defineのようになります)は、preprocessorの一部です。これは実際には、メインコンパイラの前に実行される別のプログラムで、のようなものには、ソースとマクロの展開にファイルが含まれています。

+0

答えに感謝します:) –

+1

"これは実際には別のプログラムです" - GCCを使用している場合はそれです。 MSVCを使用している場合はそうではありません。重要な点は、前処理は、メインコンパイル段階の前に発生するフェーズとして標準で定義されており、セミコロンを含まない独自の定義済み構文があることです。翻訳段階をプログラムに編成する方法は、実装までは全く異なります。 –

2

#includeはプリプロセッサで処理され、コンパイラはこれらの文を認識しません。したがって、文の最後に;は必要ありません。

1
#include "whatever.h" 

これは、ソースファイルのその行を "whatever.h"に置き換えただけです。したがって、 "whatever.h"の最後に;を置く必要はありません。プリプロセッサは警告を出し、無視します。

+0

「プリプロセッサはあなたに警告を与え、あなたの答えの中のステートメントを無視しますか? –

+1

私はその考え方は 'あなたが '#include" whatever.h ";'を書くと、プリプロセッサは警告を出し、セミコロンを無視するということです。 –

+0

#を見たトークンを読んでいる間に、その後にキーワード(include、define、pragmaなど)を探します。特にインクルードの場合、次のトークンの後ろに<または一重引用符( ")とファイル名、それに対応する終了トークン>または(")が続きます。その後の次の文字は改行と見なされます。そうでなければ、それは理解できなかった余分なトークンに対して警告を出します。 @JonathanLefflerは「無視する」と述べたので、ヘッダーファイル用ではありません。 –

2

前処理ディレクティブはステートメントではないためです。

すべての文で最終的に;が必要なわけではありません。例えば:1つのifの文と1つの空の複合文:

int bla = 1; 

if (bla) { 
} 

blaの宣言の後、私たちは二つの文を持っています。 ;はありませんが、プログラムは有効です。

2

ディレクティブはプリプロセッサによって処理されます。コンパイラではなく、単純なテキスト置換プロセッサです。これは、空白として扱うCコンパイラとは異なり、行末を(\n)を重要な文字として使用します。また、行の最後に\がある理由も影響します。

+0

私はこの行が何であるか把握できませんでした。また、行頭に\があるという理由も意味します。より具体的になりますか?ありがとう。 –

+0

これはどのC言語の本でもよくカバーされています。 –

+0

はい、私はK&Rです。 –

関連する問題