fbr*_*eto 19 macros pragma clang
我想添加一些宏来缓解(un)在我们内部弃用的例程周围设置一个特定的警告.
我想转此:
#pragma clang diagnostic push
#pragma clang diagnostic warning "-Wdeprecated-declarations"
void Foo() __attribute__((deprecated("Warning: deprecated routine")))
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)
进入这个:
MY_DEPRECATED_BEGIN
void Foo() MY_DEPRECATED
MY_DEPRECATED_END
Run Code Online (Sandbox Code Playgroud)
该MY_DEPRECATED_BEGIN宏给我的麻烦,我必须指定2个在一个宏编译指示.可以这样做吗?
(仅使用MY_DEPRECATED宏实现相同效果的解决方案的奖励积分!)
Quu*_*one 20
void Foo() __attribute__((deprecated));
#define MY_DEPRECATED_BEGIN \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic warning \"-Wdeprecated-declarations\"")
int main()
{
MY_DEPRECATED_BEGIN
Foo();
#pragma clang diagnostic pop
}
Run Code Online (Sandbox Code Playgroud)
对您的技术问题的简短回答是C99提供了_Pragma("foo")相当于#pragma foo稍后处理的构造,并且不需要单独处理.
你的另一个问题是-Wdeprecated-declarations没有你认为它做的事情.简单地宣布为过时永远不会给你的诊断功能,因为__attribute__((deprecated))是应该被使用(一般在头文件).如果你是什么原因导致的诊断是使用一个过时的功能-这是在该点的设置-Wdeprecated变得相关.
如果你真的只是想弃用Foo当且仅当MY_DEPRECATED设置,然后做正确的方式即是
#ifdef MY_DEPRECATED
#define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
#else
#define ATTRIBUTE_DEPRECATED
#endif
void Foo() ATTRIBUTE_DEPRECATED;
Run Code Online (Sandbox Code Playgroud)
您可以使用此解决方案:
#define NS_SUPPRESS_DIRECT_USE(expr) _Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")\
expr\
_Pragma("clang diagnostic pop")
Run Code Online (Sandbox Code Playgroud)
然后添加它:
NS_SUPPRESS_DIRECT_USE(
Foo();
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3357 次 |
| 最近记录: |