如何在没有警告的情况下在枚举中定义一个非常大的常量?

Mas*_*ler 6 delphi delphi-xe

我正在使用CMCHTPC MediaFoundation标头,它们似乎工作,但它们在我想要摆脱的几个点给出了编译器警告.在大多数情况下,罪魁祸首似乎是枚举如下:

TMF_Plugin_Type = (
    MF_Plugin_Type_MFT = 0,
    MF_Plugin_Type_MediaSource = 1,
    MF_Plugin_Type_MFT_MatchOutputType = 2,
    MF_Plugin_Type_Other = DWORD(-1)
    );
Run Code Online (Sandbox Code Playgroud)

无论最后一个值是如何定义的,DWORD(-1)或者DWORD($FFFFFFFF)或简单地说$FFFFFFFF,编译器总是回复:

W1012常量表达式违反了子范围

是否有任何方法可以修复此定义而无需在编译器中明确地抑制该警告?(注意这{$R-}不起作用;这会在运行时关闭范围检查,但不会在编译时关闭.)

Uwe*_*abe 9

你可以将它声明为-1并给出{$ Z4}来告诉编译器为这个枚举使用4个字节:

{$Z4}
type
  TMF_Plugin_Type = (
    MF_Plugin_Type_MFT = 0,
    MF_Plugin_Type_MediaSource = 1,
    MF_Plugin_Type_MFT_MatchOutputType = 2,
    MF_Plugin_Type_Other = -1);
Run Code Online (Sandbox Code Playgroud)

它可以在没有编译器指令的情况下工作.文档说:

要为值指定一个常量,请使用= constantExpression跟随其标识符,其中constantExpression是一个求值为整数的常量表达式.

值-1的整数在内部表示为4个字节.所以无论哪种方式都可行.

更新:我重新检查并确实需要编译器指令(除非您在项目选项中设置类似选项).