是否可以编写一个在函数范围内使用时会报错的宏?

Posted

技术标签:

【中文标题】是否可以编写一个在函数范围内使用时会报错的宏?【英文标题】:Is it possible to write a macro that will complain when it is used within the scope of a function? 【发布时间】:2012-07-29 04:10:03 【问题描述】:

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

编辑:到目前为止响应 cmets:我有在我的代码库中重复使用的静态对象。我创建了宏来加快创建这些对象的输入速度,因为这些对象在所有地方都被使用,以至于节省击键对于生产力/烦恼很重要。

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

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

【问题讨论】:

举个例子,你想在什么上下文中使用这个宏,解决什么问题。 【参考方案1】:

您正在寻找的是一种适用于文件级别但不适用于函数级别的构造。在我的脑海中,命名空间应该符合要求。

#define FOO(x) namespace  x 

FOO(int bar = 42;) // Compiles

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

由于我不确切知道您要包装什么,因此我使此宏尽可能简单。任何实际的实现都应该使用标准的宏创建技巧来确保它既好又安全。

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

【讨论】:

感谢您的回答,并编辑它以适用于我的具体问题。这看起来是一个聪明的解决方案! 必须说哇!!。需要注意的一点是,在FOO() 内完成的所有操作都将是static(相当于未命名的namespace)。 #define FOO(X) namespace x 是另一种避免使变量static 的解决方案。

以上是关于是否可以编写一个在函数范围内使用时会报错的宏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在vs2010下编写代码的时候代码下面会出现红色波浪线?

如何在cpp中编写这个可以从函数返回的宏

C语言宏定义

Python 局部变量 与全局变量

是否有用于从 julia 中的类似生成器的函数创建快速迭代器的宏?

不使用范围创建具有多个序列的条形图