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

能否将__FILE__、__LINE__、__FUNCTION__嵌入#warning/#error字符串?

如何在Clang 5.0中自动生成包含函数名的未完成实现警告?

我习惯用#warning标记未完成的函数实现,编译时能直观提示需要补全代码,示例如下:

class HttpDownloadJobAndroid : public HttpDownloadJob
{
public:
    virtual void Download() override
    {
        #warning "Please complete the implementation of the function : HttpDownloadJobAndroid::Download"

        Finished = true;
        Success = false;
    }
};

但每次复制这个警告都要手动修改函数名,效率很低。我尝试用__FUNCTION__宏自动带入函数名,但在Clang 5.0(Android平台)下两种写法都无效:

#define _ME_PP_TEXT(Expr) #Expr
#define ME_PP_TEXT(Expr) _ME_PP_TEXT(Expr)
// 无效
#warning "Please complete the implementation of the function : " __FUNCTION__
// 同样无效
#warning "Please complete the implementation of the function : " ME_PP_TEXT(__FUNCTION__)

请问有没有可行的解决方案?


解决方案:改用#pragma message结合宏实现

#warning是预处理阶段的指令,而__FUNCTION__/__PRETTY_FUNCTION__是编译阶段才会展开的宏,直接在#warning中拼接这两个宏会失败。Clang支持#pragma message指令,它能在编译阶段处理宏展开,刚好满足需求。

可以定义一个可复用的宏:

#define STRINGIFY(x) #x
#define TODO_IMPL() _Pragma(STRINGIFY(message("Please complete the implementation of the function : " __PRETTY_FUNCTION__)))

然后在未完成的函数中直接调用这个宏:

class HttpDownloadJobAndroid : public HttpDownloadJob
{
public:
    virtual void Download() override
    {
        TODO_IMPL();

        Finished = true;
        Success = false;
    }
};

说明

  • __PRETTY_FUNCTION__是Clang支持的内置宏,会展开为包含完整函数签名的字符串(比如HttpDownloadJobAndroid::Download()),比__FUNCTION__的信息更完整;
  • _Pragma是标准C++的预处理指令,用来替代传统的#pragma写法,方便在宏中拼接字符串;
  • 这个方案在Clang 5.0(Android平台)下可以正常工作,编译时会输出包含当前函数完整签名的警告信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:35:26