3

C ++でマクロを作成することは可能ですか?展開後にバックスラッシュ記号が出力されますか?

現在、私はコードを使用しています:

#define SOME_ENUM(XX) \
    XX(FirstValue,) \
    XX(SecondValue,) \
    XX(SomeOtherValue,=50) \
    XX(OneMoreValue,=100) \

しかし、上記のコードを生成するマクロを記述したいので、次のように記述できるようにします。

ENUM_BEGIN(name) // it should output: #define SOME_ENUM(XX) \
ENUM(ONE)        // it should output: XX(ONE,) \
//...

ENUM_BEGINしかし、最後にバックスラッシュが付いたものに展開する必要があるため、のようなマクロを作成できませんでした。C ++で可能ですか?

4

2 に答える 2

1

いいえ、できません。これに関連するのは、ISO / IEC 14882:2011(E)で説明されている§2.2.1、翻訳フェーズ2です。

バックスラッシュ文字()の直後に改行文字が続く各インスタンスが削除され、物理ソース行を接続して論理ソース行を形成します。物理的なソースラインの最後のバックスラッシュのみが、そのようなスプライスの一部になる資格があります。その結果、universal-character-nameの構文に一致する文字シーケンスが生成された場合、動作は未定義です。空ではなく、改行文字で終わらないソースファイル、またはそのようなスプライシングが行われる前にバックスラッシュ文字が直前にある改行文字で終わるソースファイルは、追加の改行文字のように処理されるものとします。改行文字がファイルに追加されました。

基本的に何が起こるかは\\\n\nエスケープではなく、物理的にソースにある場合)、文字として扱われ\、その後にラインスプライスが続きます。残り\は構文エラーになる可能性が高く(合法である場合もありますが、現在は表示されません)、後続の変換フェーズではラインスプライスとして扱われません(ラインスプライスはフェーズ#2でのみ発生します)。 )。

于 2013-03-26T21:02:28.220 に答える
0

そのためのドキュメントは見つかりませんでしたが、それができれば\\バックスラッシュが生成されると思います。

しかし、私の研究では、それはあなたが対処しなければならない最大のことではないかもしれないと思います。millsjがコメントしたよう#に、ENUM_BEGINでの出力に問題が発生します。#defineマクロで#記号をエスケープするを参照してください。。

于 2013-03-26T19:07:33.067 に答える