我想添加一些宏来缓解(取消)针对我们内部不赞成使用的例程设置特定的警告。
我想转这个:
#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/