2013-10-07 70 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()); \ 
    } \ 
} 

上面的宏試圖設置請求成員,如果它不是空的未聲明,但我得到這個以下 錯誤:「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_serving將擴大到set_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()); \ 
    }                \ 
}