2013-10-07 9 views
6
#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \ 
    if (!var.empty()) { \ 
    set_##x_for_serving(r->request, var.data(), var.length()); \ 
    } \ 
} 

を宣言されていない上記のマクロは、それが空でない場合、要求のメンバーを設定しようとしますが、私はこの次 のエラーが表示されます。しばらくI「set_x_for_servingは」このスコープで宣言されていませんでしたこのマクロを使用します。Cマクロ - この範囲のエラーで

上記のマクロで何が問題になっていますか?

+0

OPのコードのハイライトは私が原因トークン連結の、マルチラインマクロを中断し、構文エラーがあることを示唆してみましょうだろう。 – dhein

+1

マクロですが、それは間違っています。マクロを使用しなければならない場合は、 'set _ ## x_for_serving'を' set_ ## x ## _for_serving'に変更してください。 –

+3

これはどのように世界中でですか? –

答えて

9

xの両側にtoken-pasting operatorが正しく置き換えられるようにする必要があります。

#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \ 
    if (!var.empty()) { \ 
    set_##x##_for_serving(r->request, var.data(), var.length()); \ 
    } \ 
} 
5

SET_NONEMPTY(foobar)のマクロ呼び出しの内側に、あなたはset_##x_for_servingset_foobar_for_servingに拡大することを期待するように見えます。

これは間違いありませんか?

もしそうなら、フレーズx_for_serving単一のトークンあるとxは、交換するアイテムとしてプリプロセッサで見られることはありません。

は私があなたの代わりにset_##x##_for_servingをしたいと思う:

#define SET_NONEMPTY(x) { const NString& var = r->hdrs->get_##x(); \ 
    if (!var.empty()) {            \ 
    set_##x##_for_serving(r->request, var.data(), var.length()); \ 
    }                \ 
} 
関連する問題