C++ #在数组初始值设定项中忽略pragma警告禁用

C++ #在数组初始值设定项中忽略pragma警告禁用,c++,visual-c++,compiler-warnings,suppress-warnings,C++,Visual C++,Compiler Warnings,Suppress Warnings,我试图创建一个小的define来解决这个问题,我注意到#pragma warning(disable:…)语句的特殊行为 在以下代码中,defineQITABENT生成警告C4838 static const QITAB qit[] = { QITABENT(MediaPlayerCallback, IMFPMediaPlayerCallback) }; 我可以很容易地抑制此警告,这是有效的: #pragma warning( push ) #pragma warning( disa

我试图创建一个小的define来解决这个问题,我注意到
#pragma warning(disable:…)
语句的特殊行为

在以下代码中,define
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 )
现在我想做一个define
QITABENTEX
,它自动抑制由
QITABENT
生成的警告。但这似乎不可能,因为当我编写以下代码时,警告
C4838
抑制

    static const QITAB qit[] = 
    {
#pragma warning( push )
#pragma warning( disable: 4838 )
        QITABENT(MediaPlayerCallback, IMFPMediaPlayerCallback)
#pragma warning( pop )
        //{ 0 },
    };
编译器如何解释此代码,使警告不会被抑制

这可能与
QITABENT
的定义完全解析时有关

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

附录

关于密切投票和澄清:我与某人进行了讨论,他们只给出了一个鸟枪/链接式的答案,大概只是在中途读了这个问题(因为这个问题解释了如何在宏中使用
#pragma
,这不是我要问的),现在这个答案得到了(self)删除了,我因为不清楚而获得了接近票数的选票。因此,让我重申我对这个问题的意图:

  • 此问题与查找
    define
    以抑制此警告无关
  • 这个问题不是关于如何在VC++中抑制警告

  • 这个问题是关于试图理解上一个代码示例中的三行抑制代码发生了什么。为什么它们在该确切位置(在数组初始化中)不起作用,但在数组初始化之外起作用?这可能归结为回答如何以及何时解析pragma语句和宏


初始值设定项列表以结束方括号
}
终止,这就是生成警告的地方

试试这个:

static const QITAB qit[] =
{
    QITABENT(Derived, Base)
#pragma warning( push )
#pragma warning( disable: 4365 )
}
#pragma warning( pop )
;
[已编辑]
根据
Mr.C64
下面的评论,更正了
QITABENT(派生的,基本的)
中参数的顺序,请发布由这段代码生成的整个
C4838
警告消息。@VioletGiraffe警告是不相关的(并且在我移动pragma语句时不会改变)有趣的一点是为什么在该特定位置忽略pragma:)。您确定该警告(C4838是一个缩小转换警告)不在
return QISearch(…)
行中(在您的第一个抑制示例中),而不是在实际的结构定义中?请注意,标准C有
\u Pragma
,但Microsoft C有
\u Pragma
(根据)。无论拼写如何,似乎pragma运算符(与预处理器指令相反,
#pragma
)没有帮助;它喜欢怎么做就怎么做。如果它没有按你喜欢的方式做,你几乎肯定会被它卡住。您可以尝试向Microsoft(编译器供应商)报告该问题,但我担心,结果发生更改的可能性微乎其微。可能是抑制只能在初始值设定项的大括号之前打开,或者只能在初始值设定项的
=
之前打开,或者可能需要在声明开始之前打开。这些选择中的任何一个或所有可能都有原因(你可能并不总是同意)。啊,这是一个放置抑制代码的有趣方式。令人惊讶的是,这是有效的!给我一些关于如何解决所有问题的见解。我想你的答案中的代码有一个输入错误,应该是
QITABENT(派生,基)
(或
QITABENT(ClassName,InterfaceName)
)。出于尊重,我不想编辑你的答案;我只是想让你把错字改一下。我觉得你的答案很有用,并对它投了赞成票;更正了我答案中的代码。