質問: C言語のソースコードでライブラリをインクルードしたときソースコードにはいったいどのような変化が起きているのですか? また、インクルードしたときの記述と同等のコードはあるのでしょうか? ``` #include // この行で何が起きている? int main(void){ printf(...); return 0; } ```
回答: > > C言語のソースコードでライブラリをインクルードしたときソースコードにはいったいどのような変化が起きているのですか? > > > ソースコードに `#include`で指定されたファイル(質問コードの場合`stdio.h`の内容が`#include`が指定されている部分にそのまま埋め込まれるような感じになります。このプリプロセス処理はCコンパイラがコンパイルに先立ってプロプロセッサを呼び出して行います。 ちなみにgccであれば`-E`オプションを付けると、プリプロセスだけを行った結果を出力出来るので興味があれば試してみると良いかと思います。(プリプロセスでは`#include`の展開以外に`#define`の展開や`#if`等の条件コンパイルの際のコンパイルされない部分の排除も行います。) > > また、インクルードしたときの記述と同等のコードはあるのでしょうか? > > > 同等というのがどこまでのレベルを指しているかによりますが、インクルード対象ファイルの内容をそのまま埋め込めば(そのインクルードファイルの中に`#include`が指定されていればそれもすべて再帰的に埋め込みます)同等になると思います。 もっとゆるい意味での同等ということならばインクルード対象ファイルに記述されている定義の中で自分が必要な部分だけを選択してソースコードにコピー&ペーストしていくという感じになると思います。 ※コメントの指摘を受けて追記 `#include`の展開はイメージ的には以下のような感じになります。(コメントで指摘されている通り、実際には内部の`#`で始まるプリプロセッサ指示が展開されてしまうので、最終的な展開結果は元の`stdio.h`のファイル内容とは見た目が異なるものになります。) ``` //#include // この行で何が起きている? ↑↑↑上のファイルの内容が↓↓↓下のようにそのまま展開される /* Define ISO C stdio on top of C++ iostreams. Copyright (C) 1991-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. */(途中省略) The GNU C Library is free software; you can redistribute it and/or #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function # include #endif #ifdef __LDBL_COMPAT # include #endif __END_DECLS #endif /* included. */ int main(void){ printf(...); return 0; } ```