数组初始值设定项

时间:2016-01-11 13:47:46

标签: c++ visual-c++ compiler-warnings suppress-warnings

我试图创建一个小的定义来解决this bug in QITABENT,我注意到#pragma warning (disable: ...)语句的特殊行为。

在以下代码中,定义QITABENT会生成警告C4838

static const QITAB qit[] = 
{
    QITABENT(MediaPlayerCallback, IMFPMediaPlayerCallback)
};

我可以轻松地压制此警告,这有效:

#pragma warning( push )
#pragma warning( disable: 4838 )

    static const QITAB qit[] = 
    {
        QITABENT(MediaPlayerCallback, IMFPMediaPlayerCallback)
        //{ 0 },
    };
    return QISearch(this, qit, riid, ppv);

#pragma warning( pop )

现在我想制作一个自定义QITABENTEX的定义QITABENT来自动抑制C4838生成的警告。但似乎不可能,因为当我编写以下代码时,警告 static const QITAB qit[] = { #pragma warning( push ) #pragma warning( disable: 4838 ) QITABENT(MediaPlayerCallback, IMFPMediaPlayerCallback) #pragma warning( pop ) //{ 0 }, }; 被抑制。

QITABENT

编译器如何以不抑制警告的方式解释此代码?

这可能与#pragma的定义何时完全解决有关。

(请注意,我对上述代码的工作并不感兴趣,我真的好奇它是如何通过编译器解释的)

附录

关于近距离投票和澄清:我与某人进行了讨论,只给出了一个猎枪/仅限链接的答案,大概只是在中途阅读问题(因为问题解释了如何在宏中使用define并不是我所要求的)现在答案得到(自我)删除,我得到了一个不明确的投票。因此,请允许我重申我对这个问题的意图:

  • 此问题与查找 remove_filter( 'the_content', 'wpautop' ); 以取消此警告
  • 无关
  • 这个问题不是关于如何在VC ++中抑制警告

  • 这个问题是关于尝试理解最后一个代码示例中的三行抑制代码会发生什么。为什么它们在那个确切的位置没有效果(在数组初始化中)但是在数组初始化之外有效?这可能归结为回答pragma语句和宏交叉的解析方式和时间。

1 个答案:

答案 0 :(得分:4)

初始化列表以结束大括号}结束,这就是生成警告的地方。

试试这个:

static const QITAB qit[] =
{
    QITABENT(Derived, Base)
#pragma warning( push )
#pragma warning( disable: 4365 )
}
#pragma warning( pop )
;

[编辑] 根据下面Mr.C64的评论,更正了QITABENT(Derived, Base)中的参数顺序。