如何为Clang定义具有多个编译指示的宏?

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)


AlK*_*zin 9

您可以使用此解决方案:

#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)