我在 gcc 4.7.1 (std=c++11) 中的预处理器标记粘贴运算符上遇到问题。即,考虑以下代码:
// Create a name for a global map (this works)
#define GLOBAL_MAP(name) g_map_ ## name // This works fine
// Now, namespace qualify this map (this fails to compile when used)
#define NS_QUAL_GLOBAL_MAP(name) SomeNamespace:: ## GLOBAL_MAP(name)
使用场景-首先是地图定义:
std::map<std::string,std::string> GLOBAL_MAP(my_map);
namespace SomeNamespace
{
std::map<std::string,std::string> GLOBAL_MAP(my_map);
}
现在的用法:
void foo()
{
bar(GLOBAL_MAP(my_map)); // This compiles fine
baz(NS_QUAL_GLOBAL_MAP(my_map)); // This fails to compile with:
// error: pasting "::" and "NAME_MAP" does not give a
// valid preprocessing token
}
我相信可能发生的是它正在解释GLOBAL_MAP
after ##
作为粘贴的标记而不是要进一步扩展的宏。我该如何解决这个问题?
令牌粘贴生成single供编译器读取的令牌。这不是你想要的——::
本身就是一个有效的 C++ 标记,但是::g_map_my_map
不是编译器知道的标记。
因此,删除令牌粘贴运算符:
#define NS_QUAL_GLOBAL_MAP(type) SomeNamespace::GLOBAL_MAP(type)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)