如果在构造函数中使用宏,它可以以不同的方式扩展吗?

Can a macro expand differently if it's used in a constructor?

本文关键字:方式 扩展 构造函数 如果      更新时间:2023-10-16

我想有一个宏,比如MAGIC,或者MAGIC(*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;
  }
};

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