1

インクルードファイルにマクロがあるとしましょう:

// a.h
#define VALUE SUBSTITUTE

そして、それを含む別のファイル:

// b.h
#define SUBSTITUTE 3
#include "a.h"

VALUE が SUBSTITUTE に定義され、3 への 2 つのパスでマクロ展開される場合ですか、それとも VALUE が SUBSTITUTE のマクロ展開された値 (つまり 3) に設定されている場合ですか?

Boost プリプロセッサ ライブラリと、その BOOST_PP_SLOT がどのように定義されているかを理解しようとするために、この質問をします (編集:基本的な仕組みを意味します)。したがって、上記の質問をしている間、誰かがそれを説明できるかどうかも興味があります.

(そして、「塗装された青」のルールを見つけるための一体どこに書かれているのか知りたいとも思います...)

4

1 に答える 1

1

VALUEとして定義されSUBSTITUTEます。の定義は、定義済みのVALUEどの時点でも認識されませんSUBSTITUTE。が置換された後VALUE、置換されたものはすべて再度スキャンされ、その後さらに置換が適用される可能性があります。すべてdefineの s は、お互いをまったく意識せずに、独自の概念空間に存在します。それらは、メイン プログラム テキストの展開の場所でのみ相互に作用します ( defines はディレクティブであり、プログラム本体の一部ではありません)。

プリプロセッサのルールは、言語標準で C 固有のルールと一緒に指定されています。標準ドキュメント自体には費用がかかりますが、通常は「最終ドラフト」を無料でダウンロードできます。最新 (C11) はここにあります: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

自宅で使用する場合、ドラフトは本物とほとんど同じです。標準を引用するほとんどの人は、実際にはドラフトのコピーを見ています。(確かに、実際の C コンパイラよりも実際の標準に近いです...)

GCC マニュアルには、マクロ規則のよりアクセスしやすい説明があります: http://gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html


さらに... Boost プリプロセッサ ライブラリについては、使用したことがないのであまり説明できませんでしたが、Order と Chaosと呼ばれる同じ作成者による美しいライブラリのペアがあり、 (マクロ コードのように) 非常に「クリーン」であり、理解しやすい。それらはよりアカデミックなトーンであり、ポータブルではなく純粋であることを目的としています。これにより、読みやすくなる可能性があります。

(Boost PPがわからないので、これがあなたの質問にどの程度関連しているかはわかりません)この回答には、これらのライブラリが高度なメタプログラミング構造に使用するテクニックの子供たちの良い紹介例もあります:C99プリプロセッサはチューリングですか完了?

于 2013-06-13T18:07:31.943 に答える