enum RecordCreateOptionsEnum
{
    adCreateCollection = 8192,
    adCreateStructDoc = -2147483648,
    adCreateNonCollection = 0,
    adOpenIfExists = 33554432,
    adCreateOverwrite = 67108864,
    adFailIfNotExists = -1
};
红色的那句出现如下警告
warning C4146: unary minus operator applied to unsigned type, result still unsigned是什么意思?

解决方案 »

  1.   

    超过范围了
    enum 类型的量最好使用默认值
      

  2.   

    那这个东西我没改过啊!能手动改成adCreateStructDoc = -2147483648吗? 
      

  3.   

    标准中是这样说明的:“枚举类型的尺寸是以能够容纳最大枚举子的值的整数的尺寸”,同时标准中也说名了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”,也就是说,枚举类型的尺寸不能够超过int类型的尺寸,但是是不是必须和int类型具有相同的尺寸呢?上面的标准已经说得很清楚了,只要能够容纳最大的枚举子的值的整数就可以了,那么就是说可以是char、short和int。你所定义的
    enum RecordCreateOptionsEnum 

        adCreateCollection = 8192, 
        adCreateStructDoc = -2147483648, 
        adCreateNonCollection = 0, 
        adOpenIfExists = 33554432, 
        adCreateOverwrite = 67108864, 
        adFailIfNotExists = -1 
    }; 其中,绝对值最大是2147483648.已经需要16bit才能存储了,无法再添加符号位。你可以试一下adCreateStructDoc = -2147483647.具体请参考参考自Bjarne Stroustrup的 The C++ Programming Languane 中4.8 Enumerations [dcl.enum]
    一节。
      

  4.   

    我改成adCreateStructDoc = -2147483647也不行,又改成adCreateStructDoc = -2147,还是不行!
      

  5.   

    你是不是用ado?这个是微软的bug来的
    自己屏蔽掉这个warning就可以了
    在import之前屏蔽掉他
    #pragma warning(push)
    #pragma warning(disable:4146)
    #import "c:\program files\common files\system\ado\msado15.dll" rename("EOF","adoEOF")
    using namespace ADODB; //使用ADO名字空间
    #pragma warning(pop) 
      

  6.   

    这个应该没事 ado时候我也出现过
      

  7.   

    adCreateStructDoc为无符号类型;语句中出现了单减算子,结果仍然是无符号.
    警告说明,语句含义可能与你的实际目的不同.
      

  8.   

    换言之,你可以改为:
    adCreateStructDoc=2147483648;//去掉符号就可以了.
      

  9.   

    改成adCreateStructDoc=2147483648;也不行,我试过了8楼和9楼说得对,是ADO的问题!屏蔽掉就不出现了!谢谢各位的回答!
      

  10.   

    比较晦涩的C语法问题
    C99规定,所有的数字常量都是以数字打头的的,也就是,编译器看到-2147483648,它并不认为一个数值,而是一个数值表达式
    事实上它认为是是2147483648加上了一元负运算符‘-’
    因为signed int的范围是[-2147483648, 2147483647],2147483648超过了int的上限,编译器认为这是个unsigned,但是unsigned却用了取负运算,这是不合理的,所以报warnig跟最后算得的值是多少没关系,你写成adCreateStructDoc = -2147483648 + 100 一样报warnig
      

  11.   

    我的改成adCreateStructDoc=2147483648;就没有警告了