c++ - token 粘贴似乎不适用于 C++ 宏

标签 c++ macros

我正在尝试使用宏来模仿 C++ 中的模板行为。例如,如果我想要一个 int* 列表,那么我会这样做:

typedef int* IntPtr;
List_DEFINE(IntPtr)

请注意,List_DEFINE(IntPtr) 没有分号,因为它是一个宏。我已经编写了我的列表“类”(实际上只是几个带有方法指针的结构),并在将其设为宏之前对其进行了测试。我现在正试图“宏化”我的代码,但我遇到了问题。我已经这样定义了我的宏:

#define List_DEFINE(t) \
struct List_##t_Node { \
...

在上面的示例中,我认为##t 将被替换为传递给 t 的任何内容,但情况似乎并非如此。如果我定义两种不同类型的列表,我会收到以下错误:

test.cpp:85: error: redefinition of ‘struct List_t_Node’
test.cpp:75: error: previous definition of ‘struct List_t_Node’

所以在上面的示例中,我希望生成 struct List_IntPtr_Node,但生成的是 List_t_Node。为什么?

最佳答案

##之后的标记是t_Node,所以预处理器将List_粘贴到t_Node

要将 t 替换为宏参数,它必须是单个标记,然后可以将其粘贴到前面的 List_ 和后面的 _Node:

#define List_DEFINE(t) \
   struct List_ ## t ## _Node { \
   ...

关于c++ - token 粘贴似乎不适用于 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9454973/

相关文章:

c - FLT_MAX 宏在哪里定义?

c++ - 使用 (void*) cast 打印字符串中字符的内存地址

c++ - 使用 -D_GLIBCXX_USE_CXX11_ABI=0 构建 boost

c - 在 C 中使用宏处理操作

以下 C 宏会导致问题吗?

c - ESP8266 硬件定时器,uS to ticks 奇怪的宏

c++ - 从 64 位整数秒数创建一个 boost::posix_time::ptime 对象

c++ - 存储 std::weak_ptr<void> 和使用 static_pointer_cast

c++ - 将一个坐标系的旋转转换为另一个坐标系所需的矩阵

macros - Common Lisp 初学者 : Macro Question For Defining Packages on the Fly