Я определяю макрос следующим образом, и моя цель - завершить TODO
.
#define TEST(_expr, args...) \
do { \
// TODO _Static_assert to make sure __xyz is not declared \
int __xyz = _expr; \
if (__xyz < 0) { \
// do some error handling stuff utilizing args and __xyz \
} \
} while (0)
Макрос запускает _expr
(обычно вызов функции) и выполняет некоторые действия по обработке ошибок в случай неудачи. В готовом материале используются __xyz
и args...
. В этом случае разработчик, использующий этот макрос, может иметь переменную __xyz
, определенную в более высокой области видимости, и передать ее как одну из args...
. Вот пример.
int foo(void);
int bar() {
int __xyz;
// .... some lines of code
TEST(foo(), x, y, z, __xyz);
// .... some more lines of code
return 0;
}
В этом примере будет молчаливая проблема. Я хочу использовать _Static_assert
, чтобы убедиться, что ни одна из переменных __xyz
не определена ни в одной из родительских областей. в основном макрос TEST
может вызвать ошибку во время компиляции в вышеуказанной функции, потому что __xyz
определен в начале области.
- Это выполнимо? Если да, то как?
- Если это невозможно, как я могу избежать такого углового случая?
Теоретически это должно быть возможно, потому что какое-то слово объявлено / определено в некоторой строке это информация времени компиляции.
Спасибо всем заранее !!