Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。JPEGと、他の一般的な画像フォーマットとの変換を行う。記述されていたので、cjpeg.cのソースを見ました。すると、1~22行あたりまでは利用の規約などが記載されており、24行目あたりからコードが書かれていると思います。票3大前提として、C言語及びC++言語ではソースコードをコンパイラー本体に渡す前にプリプロセッサで前処理します。質問の#include、#ifdef、#define等はプリプロセッサに対するコマンドであり、コンパイラー本体はこれらを参照しません。コンパイルオプション-Eを使用するとプリプロセッサで処理されコンパイラー本体が参照する生のソースコードを得ることができます。参考までにプリプロセッサによってどのような処理が行われているのか確認することをお勧めします。この点が理解できていると、疑問点も解消しやすいと思います。これは、cdjpeg.hのファイルを読み込んでという意味ですよね?「読み込んで」の対象はコンパイラー本体ではなくプリプロセッサであることに注意してください。"cdjpeg.h"はプリプロセッサに対して当該行部分にcdjpeg.hを読み込み展開することを指示します。コンパイラー本体は展開済みソースコードを参照することになります。読み込んだファイルで定義されている場合も実行するんですか?「実行する」という解釈が理解を妨げています。状況によってコンパイラー本体に見せたいコードと見せたくないコードがあります。その際、プリプロセッサでコンパイラー本体に見せる/隠すを制御します。USE_CCOMMAND行時点でUSE_CCOMMANDマクロが定義されている場合は#endifまでのコードを見せます(つまりソースコードをそのまま残します)。逆にUSE_CCOMMANDマクロが定義されていない場合は#endifまでのコードを隠します(具体的には空行に置き換えます)。コンパイラー本体はプリプロセッサによって編集されたソースコードを参照します。Bという記述でコードのAをすべてBと置き換えて実行しなさいという意味ですよね?今回の場合、Bにあたる部分がないのですが、どういう解釈をすればよいですか?前半部分は意味不明です。後半部分も「実行しなさい」ではありません。プリプロセッサがソースコード中のAと書かれている部分を全てBに書き換えます。Bにあたる部分がない場合はソースコード中のAと書かれている部分を全て消します。コンパイラー本体は書き換え後のソースコードを参照することになります。C言語登場当時は上記説明の通りに動作していましたが、現在はコンパイルの高速化のためコンパイラー本体がプリプロセッサの役割も兼ねていて、独立したプリプロセッサを呼び出さない場合もあります。それは実装の違いでしかなく、概念としては現在も変わりません。|1質問への回答は以下になるでしょうか。"cdjpeg.h"は、ファイルcdjpeg.h`を読み込む、の意味です。マクロ変数(識別子)USE_CCOMMANDを定義しています。マクロ変数はそれが参照される時点で定義されている必要があるので、読み込んだファイルで定義されている場合、参照前に読み込むよう記述する必要があります。Aと記述した場合、Bは「空」を指定したものと考えるとよいと思います。内容が空で定義するマクロ変数を使う場合ですが、大きく分けて2種類あります。1つは、内容は不要で定義の有無だけが必要な場合です。USE_CCOMMANDによるプリプロセスの分岐がそれにあたります。一つは、#ifdefによる分岐との組み合わせで、ログ出力等の実行文を生成しないようにする場合です。次のようなソースコードを書いた場合、マクロ変数TRACEを定義しないと、LOG部分が「空」に置換されてfunc関数内のLOG部分は何も実行文がなくなります。個の銅バッジ1,2は理解できました。11:12コメントに対して、回答を追記しました。12:233の例の代入されるのは理解できるんですが、内容が空で定義するマクロ変数を使う場合がやはり理解できません。いうのは、理解できました。ひとつのほうが理解できません。|0質問2の答えですが、マクロ変数や識別子はどこで宣言されても有効です。-D"XXX=n"と記述することでもマクロは定義出来ます。XXXは「XXXが定義されていたら、値が何であろうとも」と読み替えると理解しやすいかと思います。質問3の答えですが、「マクロシンボルは定義するけど、値は何も定義しないよ」という言う意味になります。ある使い方としては同じファイルが何度もインクルードされて内容を何度も定義することを防ぐために使います。"foo.h"と書かれているので、もう一回foo.hが読み込まれますと言うようにfoo.hが2度読み込まれて、foo.hの内容が2度定義されてしまいます。内容終わりと記述することで、2度目にfoo.hが読み込まれても既にfoo.hは定義されているので、foo.hの本来定義したい内容を再展開しないように抑制することが出来ます。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。Expressを利用してコンパイル・実行したい4C言語のソース?にバイナリを埋め込む方法1curlでページを読み込みソースを表示する。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。