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

标签 macros clang pragma

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

我想转这个:

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

相关文章:

c++ - 如何使用 C++ 中的 D3DCompile() 定义类似函数的宏?

iOS 14 链接模块标志 'Dwarf Version' : IDs have conflicting behaviors

c++ - 在类上使用#pragma pack

c++ - 如何识别在 clang 函数体中声明的变量

c++ - 带有模板函数的 clang 编译错误

c++ - GCC 没有矢量化输出?

c - 如何实现为 _Pragma 创建带引号的字符串的宏?

c# - 为什么编译后代码注入(inject)比预编译代码注入(inject)更好?

C++ 预处理器 __typeof

c++ - 需要帮助将可变参数宏扩展为字符串化名称和值的序列