21

我想添加一些宏来简化(取消)围绕我们在内部弃用的例程设置特定警告。

我想把这个:

#pragma clang diagnostic push
#pragma clang diagnostic warning "-Wdeprecated-declarations"

void Foo() __attribute__((deprecated("Warning: deprecated routine")))

#pragma clang diagnostic pop

进入这个:

MY_DEPRECATED_BEGIN

void Foo() MY_DEPRECATED

MY_DEPRECATED_END

MY_DEPRECATED_BEGIN宏给我带来了麻烦,因为我必须在一个宏中指定两个编译指示。这可以做到吗?

(仅使用 MY_DEPRECATED 宏实现相同效果的解决方案的奖励积分!)

4

2 回答 2

23
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
}

对您的技术问题的简短回答是 C99 提供了_Pragma("foo")构造,它相当于#pragma foo但稍晚处理,并且不需要单独在线。

你的另一个问题是它-Wdeprecated-declarations没有做你认为它做的事情。简单地将函数声明为已弃用永远不会给您诊断,因为应该使用(通常在头文件中)__attribute__((deprecated))。导致诊断的原因是您是否使用了不推荐使用的功能 - 并且此时设置变得相关。-Wdeprecated

如果您真的只想弃用FooiffMY_DEPRECATED设置,那么正确的方法

#ifdef MY_DEPRECATED
 #define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
#else
 #define ATTRIBUTE_DEPRECATED
#endif

void Foo() ATTRIBUTE_DEPRECATED;
于 2013-01-23T01:43:44.200 回答
10

您可以使用此解决方案:

#define NS_SUPPRESS_DIRECT_USE(expr)   _Pragma("clang diagnostic push") \
                                       _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")\
                                       expr\
                                       _Pragma("clang diagnostic pop") 

然后只需添加它:

NS_SUPPRESS_DIRECT_USE(
                      Foo();
                      );
于 2015-09-11T04:31:37.653 回答