用于名称空间限定的C++预处理程序标记粘贴

Mic*_*eyn 4 c++ c-preprocessor c++11

我在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)
Run Code Online (Sandbox Code Playgroud)

使用场景 - 首先是地图定义:

std::map<std::string,std::string> GLOBAL_MAP(my_map);

namespace SomeNamespace
{

std::map<std::string,std::string> GLOBAL_MAP(my_map);

}
Run Code Online (Sandbox Code Playgroud)

现在用法:

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
}
Run Code Online (Sandbox Code Playgroud)

我相信可能发生的是,它是解释GLOBAL_MAP##的令牌粘贴,而不是一个宏来进一步扩大.我该如何解决这个问题?

Kon*_*lph 12

令牌粘贴生成单个令牌供编译器读取.这不是你想要的 -  ::它本身就是一个有效的C++标记,但::g_map_my_map它不是编译器知道的标记.

因此,删除令牌粘贴运算符:

#define NS_QUAL_GLOBAL_MAP(type) SomeNamespace::GLOBAL_MAP(type)
Run Code Online (Sandbox Code Playgroud)