C / C ++マクロ展開とコード生成
-
05-07-2019 - |
質問
両方のマクロ展開&コード生成には長所と長所があります短所好きなアプローチとその理由は何ですか?どちらを選択するかはいつですか?ご教授ください。ありがとう!
マクロ展開は非常に便利です&役立つ: http://dtemplatelib.sourceforge.net/table.htm
vs
コード生成では、多くの素晴らしいコードが提供されます: http://code.google.com/p/protobuf/ http://incubator.apache.org/thrift/
解決
これはトレードオフです。例を挙げましょう。 1985年頃に差分実行の手法を見つけましたが、これは本当に良いことだと思いますユーザーインターフェイスをプログラミングするためのツール。基本的に、次のような単純な構造化プログラムが必要です。
void Foo(..args..){
x = y;
if (..some test..){
Bar(arg1, ...)
}
while(..another test..){
...
}
...
}
と、次のような制御構造を持つマック:
void deFoo(..args..){
if (mode & 1){x = y;}
{int svmode = mode; if (deIf(..some test..)){
deBar(((mode & 1) arg1 : 0), ...)
} mode = svmode;}
{int svmode = mode; while(deIf(..another test..)){
...
} mode = svmode;}
...
}
今、それを行うための本当に良い方法は、Cまたはベース言語が何であれ、パーサーを記述し、解析ツリーを歩いて、必要なコードを生成することです。 (私がLispでやったとき、その部分は簡単だった。)
しかし、C、C ++などのパーサーを作成したいのは誰ですか?
したがって、代わりにマクロを作成するだけで、次のようなコードを作成できます。
void deFoo(..args..){
PROTECT(x = y);
IF(..some test..)
deBar(PROTECT(arg1), ...)
END
WHILE(..another test..)
...
END
...
}
ただし、C#でこれを行うと、知恵のある人がマクロが悪いと判断し、C#パーサーを作成したくないので、コード生成を手作業で行う必要があります。これは王室の痛みですが、これらのことをコーディングする通常の方法と比較して、それはまだ価値があります。
他のヒント
c ++の場合、マクロよりもテンプレートメタプログラミングまたはコード生成のいずれかを好みますが、マクロにはまだ用途があります。
dbtemplatelibで指定した例は、c ++ 0x Variadicでカバーできます。テンプレート、タイプチェックなどの追加の利点があります。
CまたはC ++では、マクロ展開をデバッグするのが難しいことで有名です。一方、コードジェネレーターは、それ自体が別のプログラムであるため、コードジェネレーターを記述する方が簡単にデバッグできます。
ただし、これはCプリプロセッサの制限にすぎないことに注意してください。たとえば、Lispファミリーの言語では、マクロ展開は コード生成であり、まったく同じものです。マクロを作成するには、S式の入力を別のS式に変換するプログラムを(Lispで)作成し、それをコンパイラに渡します。
どちらにも問題があります。マクロとは異なり、コード生成は読み取り可能およびデバッグ可能な(それは単語ですか?)コードを生成できますが、柔軟性が低く、変更が困難です。