2

特定の言語から C++ に自動的に翻訳する必要があります。ソース言語にはStatement Exprsに相当するものがあり、標準C++(実際にはC++ 11)でそれを複製するのは非常に困難です。

最初はラムダを考えましたが、結果は非常に醜く (ラムダ内のラムダ内のラムダ...)、大規模なソースに適用するとコンパイラがひざまずく可能性があります。

どうすればその GNU 拡張機能を複製できますか? 構築/破壊/コピーなどに関するセマンティクスを維持することが不可欠であるため、これを翻訳すると:

Foo foo( { ... declarations and statements ... } );

これに:

Foo foo;
... declarations and statements ...
foo = last result;

は正しくありません (Fooステートメント ブロックの最後の値で構築されるのではなく、既定のコンストラクターで構築されてから割り当てられます。また、ステートメント ブロック内で作成されたオブジェクトは、ケースごとに異なる有効期間を持ちます)。

この質問は、その拡張機能を使用するプログラムを標準 C++ に変換する必要がある場合にも適用されることに注意してください。

4

3 に答える 3

1

これはうまくいくかもしれません

uint8_t foo[sizeof (Foo)];
do {
  /* declarations and statements */
  new (foo) Foo (/*last result*/);
} while (0);

次に、foo へのすべての参照を次のように置き換えます。

*((Foo *) foo)
于 2013-09-08T11:06:06.373 に答える