能否将__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
相关产品推荐
相关产品推荐

