【问题标题】:How do I define a macro with multiple pragmas for Clang?如何为 Clang 定义具有多个编译指示的宏?
【发布时间】:2012-11-29 09:18:10
【问题描述】:

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

我想转这个:

#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 宏给我带来了麻烦,因为我必须在单个宏中指定 两个 pragma。这个可以吗?

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

【问题讨论】:

    标签: macros clang pragma


    【解决方案1】:
    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 iff MY_DEPRECATED ,那么正确的做法是

    #ifdef MY_DEPRECATED
     #define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
    #else
     #define ATTRIBUTE_DEPRECATED
    #endif
    
    void Foo() ATTRIBUTE_DEPRECATED;
    

    【讨论】:

    • 为我节省了很多时间。谢谢!
    【解决方案2】:

    你可以使用这个解决方案:

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

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多