背景
在大型项目中,我们会遇到很多的命名空间,有时候会不小心把全局变量也囊括到某一个namespace中,这样会导致后面排查为题很麻烦,为了保证一些对象在全局namespace中定义,且在编译期就会报警错误,又如下解决方案。
示例
#define Test(Type) \
struct Demo_##Type {}; \
static_assert(std::is_same<::Demo_##Type, Demo_##Type>::value, "must be global namespace"); \
Type obj; \
//编译时候报错
namespace Hello
{
Test(Type);
}
//编译时候不报错
Test(Type);
paddle中的应用
/**
* check if MACRO is used in GLOBAL NAMESPACE.
*/
#define STATIC_ASSERT_GLOBAL_NAMESPACE(uniq_name, msg) \
struct __test_global_namespace_##uniq_name##__ {}; \
static_assert(std::is_same<::__test_global_namespace_##uniq_name##__, \
__test_global_namespace_##uniq_name##__>::value, \
msg)
/*