質問

両方のマクロ展開&コード生成には長所と長所があります短所好きなアプローチとその理由は何ですか?どちらを選択するかはいつですか?ご教授ください。ありがとう!

マクロ展開は非常に便利です&役立つ: 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で)作成し、それをコンパイラに渡します。

どちらにも問題があります。マクロとは異なり、コード生成は読み取り可能およびデバッグ可能な(それは単語ですか?)コードを生成できますが、柔軟性が低く、変更が困難です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top