【问题标题】:Define a macro to be run at global scope without warnings定义要在全局范围内运行且没有警告的宏
【发布时间】:2026-01-15 02:25:01
【问题描述】:

下面的代码没问题,但由于多余的 ';' 我收到了警告在初始化之后。

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

INIT;

int main() { ... }

我怎样才能修复这个代码,允许带有额外的';'的符号?

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

【问题讨论】:

  • 这看起来像是一个 XY 问题。为什么需要在那里添加;?为什么首先需要一个宏?
  • 你用的是什么编译器? ideone c++14 并没有为我抱怨。虽然我不确定警告级别。 ideone.com/4VzHaL
  • @drescherjm:需要-Wpedantic

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


【解决方案1】:

如果您真的想要强制使用分号,一种可能的解决方法是使用“唯一”名称定义未使用的 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.

【讨论】:

  • 这很好,但请注意它破坏了与 MSVC 的兼容性。
  • 谢谢 Vittorio,但我想说的是,与其使用那种略显神秘的代码,我更愿意得到警告。
  • @Pietro:如果您满意,您介意接受这个答案,以便将问题标记为“已解决”吗?谢谢。或者,您可以发布自己的答案并接受。
【解决方案2】:

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

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

INIT;

int main() { ... }

【讨论】: