2011-01-20 7 views
2

私はvariadicマクロに送られた最初の実際のパラメータを取得しようとします。これは私が試したもので、これはVS2010で動作しません。他にvariadicパラメータだけを取ってマクロに送られた最初のパラメータを取り除く方法

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

私はFIRST_ARGMY_MACROに送られた引数リスト全体を返すことがわかりプリプロセッサの出力を見て...

私が試してみると、手を差し伸べてください:

FIRST_ARG(1,2,3) 

意図したとおりに1に伸びます。

これは、悪名高い2レベルの連結マクロによって解決された問題の逆のようです。私は "マクロのパラメータはマクロ本体に挿入される前に完全に拡張されている"ことを知っていますが、これは私がコンテキストの意味で何を意味するのか理解していないので、ここで助けてくれないようです... Nに設定され、後で評価されます。私は余分なマクロレベルでいくつかの方法を試しましたが、助けにはなりませんでした。

答えて

6

これはa bug in the Visual C++ preprocessorです。記載されている回避策が機能します。この:私はリンクが潜在的に有用に見える "回避策" を持っていることに注意し

decltype(x) 
+0

#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) 

がに展開されます。 – aschepler

+1

@aschepler:はい。私はちょうどそれを見て、OPのユースケースでそれをテストしていました。それはうまく動作し、私は答えにデモを追加しました。回避策は、マクロを書くときに最も重要なルールを示しています。「最初は成功しない場合は、カッコを追加してください。 ;-) –

+0

参照[ここ](https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly/5134656#5134656) – ghd

関連する問題