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

时间:2016-01-12 19:30:05

标签: delphi delphi-xe

我正在使用CMCHTPC MediaFoundation headers,它们似乎有用,但是它们会在我想摆脱的几个点上给出编译器警告。在大多数情况下,罪魁祸首似乎是如下所示的枚举:

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

无论最后一个值如何定义,DWORD(-1)DWORD($FFFFFFFF)或简称为$FFFFFFFF,编译器始终会回复:

  

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

有没有办法解决这个定义而没有在编译器中明确地抑制那个警告? (注意{$R-}不起作用;这会在运行时关闭范围检查,但不会在编译时关闭。)

3 个答案:

答案 0 :(得分:8)

你可以将它声明为-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);

没有编译器指令也可以工作。文档说:

  

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

值-1的整数在内部表示为4个字节。所以无论哪种方式都应该有效。

更新:我重新检查了,确实需要编译器指令(除非你在项目选项中设置了类似的选项)。

答案 1 :(得分:0)

据我所知,你有两个选择。

  1. 移除DWORD演员阵容,并将DWORD(-1)替换为-1,如Uwe的回答中所述。
  2. 取消此特定编译器警告。您可以使用{$WARN BOUNDS_ERROR OFF}
  3. 在代码中执行此操作

    选项1的缺点是你必须找到所有这样的声明并进行更改。这意味着对第三方库进行批量更改。如果您希望接受该库的新版本,则必须重新应用这些更改。对于某些图书馆来说,这可能会有问题。

    所以在我看来,抑制警告可能是更清洁的方法。您可以将抑制指令放在包含文件中,或放在单元的头部。这意味着您对第三方代码所做的更改范围较窄。

答案 2 :(得分:-2)

我认为您可以看到In [1]: import pandas as pd In [2]: import numpy as np In [3]: a=pd.Series([1,np.nan]) In [4]: b=pd.DataFrame(["a","b"]) In [5]: b["1"]=np.where( a.isnull(), np.nan, "Hello" ) In [6]: b Out[6]: 0 1 0 a Hello 1 b nan In [7]: b[1].isnull() Out[7]: 0 False 1 False Name: 1, dtype: bool TColorTColorRec的宣传方式,并使用Embarcadero的经验宣布:

System.UITypes