Определите макрос для запуска в глобальной области без предупреждений

Следующий код в порядке, но я получаю предупреждение из-за дополнительного ';' после INIT.

#define INIT \
    namespace Vars { \
      int a = 0; \
    }

INIT;

int main() { ... }

Как я могу исправить этот код, разрешив нотацию с дополнительным ';'?

Учтите, что INIT должен вызываться в глобальном масштабе.

2 ответа

Решение

Это решение кажется разумным:

#define INIT \
    namespace Vars { \
      int a = 0; \
    } int INIT_ = 0

INIT;

int main() { ... }

Если вы действительно хотите использовать точку с запятой, одним из возможных способов решения этой проблемы является определение неиспользованного struct с "уникальным" именем, например:

#define CAT_IMPL(m0, m1) m0##m1
#define CAT(m0, m1) CAT_IMPL(m0, m1)

#define INIT \
    namespace Vars { \
      \
    } \
    struct CAT(some_unique_name, __LINE__) \
    { } __attribute__((unused))

INIT;
INIT;

int main() { }

Пример колиру здесь.

Другие вопросы по тегам