You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Rust unimplemented!()宏的纯C等效实现方案

纯C实现类似Rust unimplemented!() 的宏

针对你需要的「未实现函数触发崩溃,且Debug/Release模式都生效、调试器能定位」的需求,直接用assert(false)或exit(-1)都有缺陷,这里给你几个实用的实现方案:

基础版宏

兼顾Debug下的定位信息和Release下的崩溃触发:

#include <stdlib.h>
#include <assert.h>

#define UNIMPLEMENTED() do { \
    assert(!"未实现的函数被调用"); \
    abort(); \
} while(0)
  • Debug模式:断言失败会打印包含文件名、行号的错误信息,调试器能直接跳转到UNIMPLEMENTED()的调用位置。
  • Release模式:assert会被编译剔除,此时abort()会触发SIGABRT信号让程序崩溃,只要保留符号表,调试器依然能通过调用栈找到崩溃点。

带详细日志的版本

如果需要Release下也能看到崩溃位置的日志,可以加上标准输出:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define UNIMPLEMENTED() do { \
    fprintf(stderr, "错误:未实现的函数被调用,位置:%s:%d\n", __FILE__, __LINE__); \
    assert(!"未实现的函数被调用"); \
    abort(); \
} while(0)

用编译器内置指令强化

GCC和Clang都支持__builtin_trap(),它会直接触发非法指令崩溃,比abort()更直接,不需要依赖标准库的行为:

#include <stdio.h>
#include <assert.h>

#define UNIMPLEMENTED() do { \
    fprintf(stderr, "错误:未实现的函数被调用,位置:%s:%d\n", __FILE__, __LINE__); \
    assert(!"未实现的函数被调用"); \
    __builtin_trap(); \
} while(0)

为什么不选exit(-1)?

exit()只是直接终止程序,不会生成核心转储,调试器没法回溯到具体的调用位置;而abort()或__builtin_trap()会触发崩溃信号,保留调用栈信息,方便调试。

内容的提问来源于stack exchange,提问作者wirrbel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:27:12