Cでは、ステートメントの終了を示すためにセミコロン(;
)が使用されています。なぜ#include
行はセミコロンを必要としませんか?なぜ#includeディレクティブにステートメントの最後にセミコロンがないのですか?
答えて
#include
(そして、#
で始まる他のすべての行は、#define
のようになります)は、preprocessorの一部です。これは実際には、メインコンパイラの前に実行される別のプログラムで、のようなものには、ソースとマクロの展開にファイルが含まれています。
答えに感謝します:) –
"これは実際には別のプログラムです" - GCCを使用している場合はそれです。 MSVCを使用している場合はそうではありません。重要な点は、前処理は、メインコンパイル段階の前に発生するフェーズとして標準で定義されており、セミコロンを含まない独自の定義済み構文があることです。翻訳段階をプログラムに編成する方法は、実装までは全く異なります。 –
#include
はプリプロセッサで処理され、コンパイラはこれらの文を認識しません。したがって、文の最後に;
は必要ありません。
#include "whatever.h"
これは、ソースファイルのその行を "whatever.h"に置き換えただけです。したがって、 "whatever.h"の最後に;
を置く必要はありません。プリプロセッサは警告を出し、無視します。
「プリプロセッサはあなたに警告を与え、あなたの答えの中のステートメントを無視しますか? –
私はその考え方は 'あなたが '#include" whatever.h ";'を書くと、プリプロセッサは警告を出し、セミコロンを無視するということです。 –
#を見たトークンを読んでいる間に、その後にキーワード(include、define、pragmaなど)を探します。特にインクルードの場合、次のトークンの後ろに<または一重引用符( ")とファイル名、それに対応する終了トークン>または(")が続きます。その後の次の文字は改行と見なされます。そうでなければ、それは理解できなかった余分なトークンに対して警告を出します。 @JonathanLefflerは「無視する」と述べたので、ヘッダーファイル用ではありません。 –
前処理ディレクティブはステートメントではないためです。
すべての文で最終的に;
が必要なわけではありません。例えば:1つのif
の文と1つの空の複合文:
int bla = 1;
if (bla) {
}
bla
の宣言の後、私たちは二つの文を持っています。 ;
はありませんが、プログラムは有効です。
ディレクティブはプリプロセッサによって処理されます。コンパイラではなく、単純なテキスト置換プロセッサです。これは、空白として扱うCコンパイラとは異なり、行末を(\n)
を重要な文字として使用します。また、行の最後に\
がある理由も影響します。
私はこの行が何であるか把握できませんでした。また、行頭に\があるという理由も意味します。より具体的になりますか?ありがとう。 –
これはどのC言語の本でもよくカバーされています。 –
はい、私はK&Rです。 –
- 1. ここにセミコロンが必要なのはなぜですか?
- 2. ステートメントの最後にJavaがダブルセミコロンのエラーを表示しないのはなぜですか?
- 3. Objective-Cがメソッド定義の最後にセミコロンを許可するのはなぜですか?
- 4. doctrine 2.2は、includeステートメントやrequireステートメントなしで、-namespace-and -use-を使用するのはなぜですか?
- 5. メソッド実装の最後にセミコロン
- 6. コンパイル時に解決されないディレクティブはなぜですか?
- 7. Function(Javascript)のif/else文の後にセミコロンがない?何がありますか?
- 8. Javaのforループの最後に余分なセミコロンの問題がある
- 9. なぜUITextViewでフレームの最後までカーソルが届かないのですか
- 10. #<Python.h>を#includeにしていないのはなぜですか?
- 11. なぜfork後にrand()がランダムでないのですか?
- 12. includeステートメントを使用するとエコーが空になる
- 13. aspxの `include`ステートメント?
- 14. 未使用のFROMテーブルが遅いステートメントになるのはなぜですか
- 15. oAuth署名の最後に "%26"が必要なのはなぜですか?
- 16. lxml.html.parse()の最後にあるスラッシュが重要なのはなぜですか?
- 17. ifステートメントにelseステートメントがないのは悪いですか?
- 18. 最後にメッセージダイアログを表示できないのはなぜですか?
- 19. IEが最後の文字の後に文字間隔を表示しないのはなぜですか?
- 20. Boost.Buildが#includeディレクティブのヘッダファイルを再帰的にスキャンしないようにする方法はありますか?
- 21. なぜ最後の子が削除されないのですか?
- 22. 共通テーブル式、なぜセミコロン?
- 23. Foo.firstが最後のレコードを返すのはなぜですか?
- 24. なぜこのループの後に最後のIDの小道具しか得られないのですか?
- 25. セミコロンでスクリプトを開始するのはなぜですか?
- 26. 最後のドラッグイベントでclientXが0にリセットされるのはなぜですか?
- 27. JQuery ui.core.jsの先頭のセミコロンはなぜですか?
- 28. .slideDown()がこのIf/Elseステートメントで動作しないのはなぜですか?
- 29. グローバルスコープとローカルスコープでディレクティブの動作が異なるのはなぜですか?
- 30. なぜ 'if'ステートメントを再計算しないのですか?
これはCステートメントではないためです。これは、プリプロセッサへの指示(命令)です。 – wildplasser
そのCの設計方法とC++の設計方法 – Surya
@Surya:関連するコメントはありません回答を見ると思います –