如果在构造函数中使用宏,宏可以扩展吗?

时间:2014-12-10 14:45:23

标签: c++ c++11 macros

我想要一个宏,比如MAGICMAGIC(*this),以便:

struct Foo {
  Foo() {
    cout << MAGIC; //Prints 1
  }
  void f() {
    cout << MAGIC; //Prints 0
  }
};

我只对这种用法感兴趣。我不关心从其他宏开始使用宏时会发生什么。如果它也适用于非成员函数,那将是很好的。

理论上,宏可以扩展到一些模板特征,然后才能真正发挥作用。

我正在使用MSVC,它提供了一组宏来将当前函数名称作为字符串文字。如果我可以将该文字与类名文字进行比较,我也认为我可以使用它,那么我可以做到(假设没有其他问题与名称修改和模板相关联),但是你不能传递char *文字作为模板参数,所以我担心它不可能实现这一点。

我知道它可以在运行时通过使用strcmp来完成,并且可能将结果缓存在本地静态变量中,但是我想在编译时使用它。

修改

以下是关于GCC的,但它真的很难看,因为它破坏了语法。 如果我至少可以像传统的C ++语法那样使用开口花括号,那将是很好的。

constexpr bool same_str(char const* a, char const* b) {
  return *a==*b && (*a==0 || same_str(a+1, b+1));
}

template< bool bSame >
struct SSame {
  static int const value = (int)bSame;
};

#define MAGIC SSame<same_str(c_strFuncName, c_strClassName)>::value

#define DEF_CLASS(x) x { constexpr static char const* c_strClassName = #x;
#define DEF_FUNC(x, ...) x(__VA_ARGS__) { constexpr static char const* c_strFuncName = #x;

struct DEF_CLASS(Foo)
  DEF_FUNC(Foo)
    cout << MAGIC;
  }
  void DEF_FUNC(f)
    cout << MAGIC;
  }
};

1 个答案:

答案 0 :(得分:0)

简单的答案是否定的。在代码之前评估宏 被解析,因此无法获得词汇上下文。至于 使用宏获取当前函数名称,该函数失败 几个计数:首先,返回当前函数的宏 name实际上扩展为生成的编译器的名称 包含名称的变量;第二,没有办法 无论如何要比较宏中的字符串;第三,除非你 想把它限制在一个构造函数中,你会用什么名字 无论如何要比较它?