Utilizzo un framework di test unità che si basa su una macro REQUIRE
per l'esecuzione di asserzioni.Espansione macro preprocessorico C preprocessor
semplificato, le macro funziona come questo:
#define REQUIRE(expr) INTERNAL_REQUIRE(expr, "REQUIRE")
che è definito simile a questo:
#define INTERNAL_REQUIRE(expr, macroName) \
PerformAssertion(macroName, #expr, expr);
PerformAssertion
's primi due parametri sono del tipo: const char*
. Il motivo del secondo parametro (#expr
) è quindi l'espressione esatta che è stata asserita può essere registrata. Questo è dove si trova il problema. Il preprocessore espande l'espressione prima che venga passata come const char *
, quindi non è la stessa espressione che è stata originariamente asserita.
Ad esempio:
REQUIRE(foo != NULL);
comporterebbe questa chiamata:
PerformAssertion("REQUIRE", "foo != 0", foo != 0);
Come si può vedere, l'espressione è parzialmente espansa, ad esempio l'espressione foo != NULL
viene visualizzata nel registro come foo != 0
. Lo NULL
(che è una macro definita per essere 0
) è stato espanso dal preprocessore C prima di creare il testo del messaggio delle asserzioni. C'è un modo in cui posso ignorare o bypassare l'espansione per il testo del messaggio?
EDIT: Ecco la soluzione, per chiunque sia curioso:
#define REQUIRE(expr) INTERNAL_REQUIRE(expr, #expr, "REQUIRE")
#define INTERNAL_REQUIRE(expr, exprString, macroName) \
PerformAssertion(macroName, exprString, expr);
Basta usare 'INTERNAL_REQUIRE (expr, #expr," REQUIRE ")' invece del modulo a due argomenti? – kennytm
Sì, lo farò. – Jeff