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

È possibile che questo macro tenta di impostare un membro richiesta se non è vuota, ma ottengo questo seguente errore: 'set_x_for_serving' non è stato dichiarato in questo ambito, mentre io usa questa macro.C Macro - non è stato dichiarato in questo errore ambito

Cosa c'è di sbagliato nella macro sopra?

+0

del PO codice di evidenziazione mi permetteva di suggerire che ci sia un errore di sintassi, che interrompe la macro multi linea, a causa della concatenazione token. – dhein

+1

È una macro, ecco cosa c'è che non va. Se devi vivere con i macro, cambia 'set _ ## x_for_serving' in' set_ ## x ## _for_serving'. –

+3

Come è il mondo fuori dal mondo? –

risposta

9

È necessario il token-pasting operator su entrambi i lati di x per farlo sostituire correttamente.

#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

Sembra all'interno di una chiamata di macro di SET_NONEMPTY(foobar), ci si aspetta che set_##x_for_serving si espanderà a set_foobar_for_serving.

È corretto?

Se è così, la frase x_for_serving è un singolo token e il x non saranno visibili dal preprocessore come un elemento da sostituire.

Penso che si desidera set_##x##_for_serving invece:

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