如果在构造函数中使用宏,它可以以不同的方式扩展吗?
Can a macro expand differently if it's used in a constructor?
我想有一个宏,比如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;
}
};
简单的答案是否定的。 宏在代码之前计算被解析,因此无法获取词法上下文。 至于使用宏获取当前函数名称,该名称在几个计数:首先,返回当前函数的宏名称实际上扩展为生成的编译器的名称包含名称的变量;二、没办法无论如何都要比较宏中的字符串;第三,除非你想将其限制为只有一个构造函数,您会叫什么名字无论如何都要比起来?
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- Qt全局快捷方式扩展劫持快捷方式
- 将ADA API暴露于C/C (可扩展方式)
- 以编程方式将终端扩展到特定大小
- 这种使用虚拟受保护方法扩展库的方式是否安全
- 最小化到停靠后恢复Qt应用程序,使用OS X上的扩展坞快捷方式
- 如果在构造函数中使用宏,它可以以不同的方式扩展吗?
- 使类信息在运行时可访问的可扩展方式
- 在C++中实现可扩展工厂的优雅方式