Stati c утверждение, чтобы проверить, определено ли имя переменной в текущей области - PullRequest
1 голос
/ 02 апреля 2020

Я определяю макрос следующим образом, и моя цель - завершить 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 определен в начале области.

  • Это выполнимо? Если да, то как?
  • Если это невозможно, как я могу избежать такого углового случая?

Теоретически это должно быть возможно, потому что какое-то слово объявлено / определено в некоторой строке это информация времени компиляции.

Спасибо всем заранее !!

...