7

可変引数マクロに送信される最初の実パラメータを取得しようとしています。これは私が試したもので、VS2010では機能しません:

#define FIRST_ARG(N, ...) N
#define MY_MACRO(...) decltype(FIRST_ARG(__VA_ARGS__))

プリプロセッサの出力を見るとFIRST_ARG、送信された引数リスト全体が返されていることがわかりますMY_MACRO...

一方、私が試してみると:

FIRST_ARG(1,2,3)

意図したとおりに 1 に展開されます。

これは、悪名高い 2 レベルの concat マクロによって解決される問題の逆のようです。「マクロパラメーターはマクロ本体に挿入される前に完全に展開される」ことは知っていますが、これがコンテキストで何を意味するのか理解できないため、ここでは役に立たないようです...そして__VA_ARGS__

明らかに__VA_ARGS__バインドされN、後でのみ評価されます。追加のマクロ レベルでいくつかの方法を試しましたが、役に立ちませんでした。

4

1 に答える 1

10

これは、Visual C++ プリプロセッサのバグです。そこに記載されている回避策は機能します。これ:

#define FIRST_ARG_(N, ...) N
#define FIRST_ARG(args) FIRST_ARG_ args
#define MY_MACRO(...) decltype(FIRST_ARG((__VA_ARGS__)))

MY_MACRO(x, y, z)

次のように展開されます。

decltype(x)
于 2011-01-20T17:57:58.137 に答える