定义要在没有警告的情况下在全局范围运行的宏

时间:2015-11-01 02:17:48

标签: c++ c-preprocessor global-scope

以下代码没问题,但由于额外的&#39 ;;'我收到了警告。在INIT之后。

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

INIT;

int main() { ... }

如何修复此代码,允许使用额外的符号';'?

考虑INIT必须在全局范围内可调用。

2 个答案:

答案 0 :(得分:2)

如果你真的想要强制使用分号,一种可能的解决方法是使用" unique"定义一个未使用的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() { }

Coliru example here

答案 1 :(得分:0)

这个解决方案似乎是合理的:

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

INIT;

int main() { ... }