1#ifndef NEFORCE_CORE_EXCEPTION_BREAKPOINT_HPP__
2#define NEFORCE_CORE_EXCEPTION_BREAKPOINT_HPP__
13NEFORCE_BEGIN_NAMESPACE__
21#if defined(NEFORCE_STATE_DEBUG) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
28# define NEFORCE_DEBUG_VERIFY(CON, MESG) \
32 assert(false && MESG); \
36# define NEFORCE_DEBUG_VERIFY(CON, MESG)
39#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
47# define NEFORCE_CONSTEXPR_ASSERT(COND) \
49 if (_NEFORCE is_constant_evaluated() && !bool(COND)) { \
50 _NEFORCE unreachable(); \
54# define NEFORCE_CONSTEXPR_ASSERT(COND)
68NEFORCE_NORETURN NEFORCE_ALWAYS_INLINE_INLINE
void unreachable() noexcept {
69#ifdef NEFORCE_COMPILER_GNUC
70 __builtin_unreachable();
76#if defined(NEFORCE_STANDARD_17) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
84 return __builtin_is_constant_evaluated();
102void NEFORCE_API
debug_assert(
bool condition,
const char* message =
nullptr);
110#ifdef NEFORCE_PLATFORM_WINDOWS
113# ifdef NEFORCE_COMPILER_CLANG
114 __builtin_debugtrap();
115# elif defined(NEFORCE_ARCH_X86)
116 asm volatile(
"int3");
117# elif defined(NEFORCE_ARCH_AARCH64)
118 asm volatile(
".inst 0xd4200000");
119# elif defined(NEFORCE_ARCH_ARM32)
120 asm volatile(
".inst 0xe7f001f0");
121# elif defined(NEFORCE_ARCH_RISCV)
122 asm volatile(
"ebreak");
123# elif defined(NEFORCE_ARCH_LOONGARCH)
124 asm volatile(
"break 0");
145NEFORCE_END_NAMESPACE__
bool NEFORCE_API is_debugger_present()
检测当前进程是否正在被调试器附加
NEFORCE_ALWAYS_INLINE_INLINE void breakpoint_if_debugging()
如果正在调试则触发断点
void NEFORCE_API debug_assert(bool condition, const char *message=nullptr)
调试断言
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE_INLINE constexpr bool is_constant_evaluated() noexcept
检查当前上下文是否在常量求值中
NEFORCE_NORETURN NEFORCE_ALWAYS_INLINE_INLINE void unreachable() noexcept
标记不可达代码路径
NEFORCE_ALWAYS_INLINE_INLINE void breakpoint() noexcept
触发调试断点