c++ - 将带有 "::"的标记作为参数传递给 C/C++ 宏

标签 c++ namespaces macros c-preprocessor

假设我有两个具有相同成员变量但不同“前缀”的结构。一个在命名空间中,另一个以特定标记为前缀。

我想编写一个宏来对这些接受不同前缀作为输入的结构执行相同的操作。我试过这个:

#include <cstdio>

struct A__foo_
{
  int bar;
} typedef A__foo;

namespace B {
  struct foo {
    int bar;
  };
}

#define GET_BAR(Prefix)\
  { \
    Prefix ## foo my_foo;\
    printf("Bar is: %d", my_foo.bar);\
  }

int main(int argc, char ** argv) {
  GET_BAR(A__);
  GET_BAR(B::);
}

我得到这个编译器错误:

macros_example.cpp:22:7: error: pasting formed '::foo', an invalid preprocessing token GET_BAR(B::);

有没有办法以一种优雅的方式重写这个宏以接受两个输入并将它们与“foo”连接起来?我已经尝试通过连接“B”和双冒号来预处理 B::。我还尝试将 Prefix ## foo 更改为简单的 Prefix foo 但随后调用 GET_BAR(A__) 会导致编译错误。

最佳答案

很难理解我脱离上下文提出的解决方案,但这里是:

#define CONCATENATE_A(X) A__ ## X
#define CONCATENATE_B(X) B:: X

#define GET_BAR(CONCATENATE)\
  { \
    CONCATENATE(foo) my_foo;\
    printf("Bar is: %d", my_foo.bar);\
  }

int main(int argc, char ** argv) {
  GET_BAR(CONCATENATE_A);
  GET_BAR(CONCATENATE_B);
}

基本上,传递一个连接函数而不是标记本身。

关于c++ - 将带有 "::"的标记作为参数传递给 C/C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35354258/

相关文章:

xslt - 替换命名空间 - 具有命名空间的属性值的问题

c++ - 检查 #ifdef 中的宏或真实条件

syntax - Common Lisp 宏语法关键字 : what do I even call this?

Python 宏 : Use Cases?

c++ - 标准 C 函数 : Check for -1 or 0?

javascript - 如何使用 JavaScriptCore 将 C++ 对象传递给 JavaScript 函数

namespaces - 带有 xmlns 命名空间的 GDataXML 写入文件

docker - 使用 uidmap 使用 containerd 的 ctr 运行容器以映射到主机上的非 root 用户

c++ - `sizeof` *真的*评估为 `std::size_t` 吗?它可以?

c++ - 如何最好地在C++中实现 “newtype”习惯用法?