是否有可能编写一个在函数范围内使用时会抱怨的宏?

时间:2012-07-29 04:10:03

标签: c++ macros c-preprocessor preprocessor-directive

我有一个宏,我只想在文件范围调用。如果在函数中使用它会以某种方式(在编译时或在运行时)抱怨它会很棒。这可能吗?

编辑:到目前为止回复评论:我的代码库中有重复使用的静态对象。我创建了一些宏来使创建这些对象的速度更快,因为这些对象遍布整个地方,以至于保存击键对生产力/烦恼很重要。

到目前为止,我一直在函数中创建这些对象作为静态。最近发现这不是线程安全的。我决定将所有这些对象移出函数,因此它们是在程序启动时而不是懒惰地创建的。我只是觉得有一个故障安全措施可以防止这个bug在将来再次出现。

要明确 - 这根本不会阻碍进步。如果它容易/可能的话,这只是我认为对宏的一个很好的补充。

1 个答案:

答案 0 :(得分:4)

您正在寻找的是一个在文件级但不在函数级工作的构造。在我的头脑中,命名空间应符合要求。

#define FOO(x) namespace { x }

FOO(int bar = 42;) // Compiles

void f() {
    FOO(int bar = 42;) // Doesn't compile
}

由于我不确切知道你要包装的是什么,所以我保持这个宏尽可能简单。任何实际的实现都应该使用标准的宏创建技巧来确保它的安全性。

请注意,匿名命名空间将使其在其中创建的每个对象仅对当前编译单元可见。在您的情况下,这不应该是一个问题,因为您的对象曾经在函数级别声明,因此在当前编译单元之外不可见。