我想添加一些宏来缓解(取消)针对我们内部不赞成使用的例程设置特定的警告。

我想转这个:

#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宏即可达到相同效果的解决方案,加分!)

最佳答案

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的设置就变得有意义了。

如果您真的只想在设置了Foo的情况下弃用MY_DEPRECATED,那么正确的方法是
#ifdef MY_DEPRECATED
 #define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
#else
 #define ATTRIBUTE_DEPRECATED
#endif

void Foo() ATTRIBUTE_DEPRECATED;

关于macros - 如何为Clang定义具有多个编译指示的宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13826722/

10-11 15:33