1#ifndef NEFORCE_CORE_EXCEPTION_BREAKPOINT_HPP__
2#define NEFORCE_CORE_EXCEPTION_BREAKPOINT_HPP__
13NEFORCE_BEGIN_NAMESPACE__
21#ifdef NEFORCE_STATE_DEBUG
28# define NEFORCE_DEBUG_VERIFY(CON, MESG) \
32 assert(false && MESG); \
36# define NEFORCE_DEBUG_VERIFY(CON, MESG)
39#ifdef NEFORCE_STANDARD_20
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#ifdef NEFORCE_STANDARD_17
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__
constexpr bool is_constant_evaluated() noexcept
检查当前上下文是否在常量求值中
void breakpoint_if_debugging()
如果正在调试则触发断点
void breakpoint() noexcept
触发调试断点
void debug_assert(bool condition, const char *message=nullptr)
调试断言
bool is_debugger_present()
检测当前进程是否正在被调试器附加
NEFORCE_NORETURN void unreachable() noexcept
标记不可达代码路径