C++通过此函数的所有路径都将在宏中调用自身
C++ all path throught this function will call itself in macro?
嘿伙计们,我已经编写了一个宏来轻松定义枚举运算符,我得到了
警告:通过此函数的所有路径都将调用自身
我知道这意味着该函数是递归的,但是在哪里?
#define DEFINE_BITMASKENUM_OPERATORS(et, ut)
constexpr et operator &(const et a, const et b) noexcept { return (et(static_cast<ut>(a) & static_cast<ut>(b))); }
constexpr et operator |(const et a, const et b) noexcept { return (et(static_cast<ut>(a) | static_cast<ut>(b))); }
constexpr et operator ^(const et a, const et b) noexcept { return (et(static_cast<ut>(a) ^ static_cast<ut>(b))); }
constexpr et operator~(const et a) noexcept { return ~(a); }
inline et& operator&=(const et& a, const et b) noexcept { return (reinterpret_cast<et&>((ut&)a &= (ut)b)); }
inline et& operator^=(const et& a, const et b) noexcept { return (reinterpret_cast<et&>((ut&)a ^= (ut)b)); }
inline et& operator|=(const et& a, const et b) noexcept { return (reinterpret_cast<et&>((ut&)a |= (ut)b)); }
et 是枚举类型,ut 是基础类型。它将像这样使用:
enum kRUNTIME_FLAGS : short16
{
kRUNTIME_FLAGS_DEF = 0b010,
kRUNTIME_FLAGS_NO_RUNTIME_STATISTICS_RECORDING = 0b0100,
kRUNTIME_FLAGS_ENABLE_TERMINAL = 0b01000,
kRUNTIME_FLAGS_ENABLE_EDIT_MODE = 0b010000,
kRUNTIME_FLAGS_ALLOW_EDIT_MODE_SWITCH = 0b0100000,
kRUNTIME_FLAGS_STOP = 0b01000000,
kRUNTIME_FLAGS_ALLOW_AUTO_STRIDE_FLUSH = 0b010000000
};
DEFINE_BITMASKENUM_OPERATORS(kRUNTIME_FLAGS, short16)
但是函数在哪里调用自身,我该如何解决这个问题?它现在已经修复了,对于每个需要这样的东西的人来说,我认为这个模板版本应该可以工作:
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
constexpr ENUM operator&(const ENUM a, const ENUM b) noexcept { return (ENUM(static_cast<ENUM_TYPE>(a) & static_cast<ENUM_TYPE>(b))); }
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
constexpr ENUM operator|(const ENUM a, const ENUM b) noexcept { return (ENUM(static_cast<ENUM_TYPE>(a) | static_cast<ENUM_TYPE>(b))); }
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
constexpr ENUM operator^(const ENUM a, const ENUM b) noexcept { return (ENUM(static_cast<ENUM_TYPE>(a) ^ static_cast<ENUM_TYPE>(b))); }
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
constexpr ENUM operator~(const ENUM a) noexcept { return ENUM(~static_cast<ENUM_TYPE>(a)); }
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
inline ENUM& operator&=(const ENUM& a, const ENUM b) noexcept { return (reinterpret_cast<ENUM&>((ENUM_TYPE&)a &= (ENUM_TYPE)b)); }
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
inline ENUM& operator^=(const ENUM& a, const ENUM b) noexcept { return (reinterpret_cast<ENUM&>((ENUM_TYPE&)a ^= (ENUM_TYPE)b)); }
template<typename ENUM, typename ENUM_TYPE = typename std::underlying_type<ENUM>::type>
inline ENUM& operator|=(const ENUM& a, const ENUM b) noexcept { return (reinterpret_cast<ENUM&>((ENUM_TYPE&)a |= (ENUM_TYPE)b)); }
更改:
constexpr et operator~(const et a) noexcept { return ~(a); }
自
constexpr et operator~(const et a) noexcept { return et(~static_cast<ut>(a)); }
它应该在没有警告的情况下编译。
#include <cstdint>
#define DEFINE_BITMASKENUM_OPERATORS(et, ut)
constexpr et operator &(const et a, const et b) noexcept { return (et(static_cast<ut>(a) & static_cast<ut>(b))); }
constexpr et operator |(const et a, const et b) noexcept { return (et(static_cast<ut>(a) | static_cast<ut>(b))); }
constexpr et operator ^(const et a, const et b) noexcept { return (et(static_cast<ut>(a) ^ static_cast<ut>(b))); }
constexpr et operator~(const et a) noexcept { return et(~static_cast<ut>(a)); }
inline et& operator&=(const et& a, const et b) noexcept { return (reinterpret_cast<et&>((ut&)a &= (ut)b)); }
inline et& operator^=(const et& a, const et b) noexcept { return (reinterpret_cast<et&>((ut&)a ^= (ut)b)); }
inline et& operator|=(const et& a, const et b) noexcept { return (reinterpret_cast<et&>((ut&)a |= (ut)b)); }
enum kRUNTIME_FLAGS : int16_t
{
kRUNTIME_FLAGS_DEF = 0b010,
kRUNTIME_FLAGS_NO_RUNTIME_STATISTICS_RECORDING = 0b0100,
kRUNTIME_FLAGS_ENABLE_TERMINAL = 0b01000,
kRUNTIME_FLAGS_ENABLE_EDIT_MODE = 0b010000,
kRUNTIME_FLAGS_ALLOW_EDIT_MODE_SWITCH = 0b0100000,
kRUNTIME_FLAGS_STOP = 0b01000000,
kRUNTIME_FLAGS_ALLOW_AUTO_STRIDE_FLUSH = 0b010000000
};
DEFINE_BITMASKENUM_OPERATORS(kRUNTIME_FLAGS, int16_t)
https://gcc.godbolt.org/z/ORF5iX
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- openCV 库调用不存在的本地路径
- 使用路径和空格的系统调用
- 从 make 调用 CMake 以获取系统库路径
- 库路径绝对是正确的,可以创建所述库的实例,但在调用任何函数时"Undefined reference"
- C++通过此函数的所有路径都将在宏中调用自身
- GCC makefile 编译和语法。如何调用 c 编译器以及包含多个路径
- 在 Visual C++ 系统调用的路径中找不到可执行文件
- 查找被调用库的路径
- 为什么是.NET 的文件。使用 UNC 路径打开 进行过多的 SMB 调用?
- C++探查器,它显示程序特定部分的调用路径
- target_link_libraries调用后链接路径混乱
- 调用 CreateProcessAsUser 时,我是否需要在 lpCommandLine 中指定一个 exe 路径作为
- 如何知道Linux下C/ c++中调用的程序路径