VS.net++编译器编译警告:vc70.pdb、 从“size_t”到“type”的转换可能丢失数据等问题的解决办法


情况1:warning C4267: “初始化” : 从“size_t”转换到“int”,可能丢失数据


如果使用 /Wp64 进行编译,或者在 64 位操作系统上编译,则在为 64 位目标程序编译时,type 为 32 位而 size_t 为 64 位。

要修复此警告,请使用 size_t而不是 type

下面的示例生成 C4267。

  1. // C4267.cpp
  2.  // compile with: /W3 /Wp64
  3. #include <Windows.h>
  4.  void Func(int i) {}
  5.  void Func2(DWORD i) {}
  6.  void Func3(size_t i) {}
  7.  
  8.  int main() {
  9.  size_t bufferSize = 10;
  10.  Func(bufferSize); // C4267
  11.  Func2(bufferSize); // C4267
  12.  Func3(bufferSize); // OK
  13.  }

在 x86 上也会发生 C4267,此警告无法在代码中解决,但可以使用 warning 杂注予以忽略和取消。

在这种情况下,C4267 是由 /Wp64 警告中的限制引起的。在 x86 上,因为 size_t 是 Win32 上的 unsigned int,因此 std::cout<<range_index 解析为接受 unsigned intoperator<< 的重载。发生 C4267 的原因是将 size_t 作为 unsigned int 参数传递,这会导致 Win64 上的截断,在 Win64 中,size_t 为 64 位,而 unsigned int 仍为 32 位。可以忽略此警告,原因如下:如果在 Win64 中进行编译,std::cout<<range_index 将解析为接受 unsigned __int64operator<< 的重载,因为类型 size_t 在 Win64 上就是该类型。32 位编译器未注意到这一点,因此会发出警告。

下面的示例生成 C4267。

  1. // C4267_b.cpp
  2.  // compile with: /W3 /Wp64 /EHsc
  3.  // processor: x86
  4. #include <fstream>
  5. #include <vector>
  6.  using namespace std;
  7.  
  8.  int main() {
  9.  ofstream outputfile;
  10.  vector<char> vecbuffer(10);
  11.  outputfile.write( &vecbuffer[0], vecbuffer.size() ); // C4267
  12.  }

情况2:对于 “vc70.pdb 缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样” 的问题

而是Clean掉工程的中间目录,如果设定多个项目的中间目录为一个目录,且相互依耐,编译就会出现问题,编译完全紊乱.特别是vc70.pdb只剩下最后一个被编译的工程的.
建议每个工程的生成目录定义成不一样的


情况3:
对于

LIBCD.lib(dbgheap.obj) : error LNK2005: _malloc already defined in LIBC.lib(mall

oc.obj)

LIBCD.lib(dbgheap.obj) : error LNK2005: __nh_malloc already defined in LIBC.lib(

malloc.obj)

LIBCD.lib(dbgheap.obj) : error LNK2005: __heap_alloc already defined in LIBC.lib

(malloc.obj)

LIBCD.lib(dbgheap.obj) : error LNK2005: _free already defined in LIBC.lib(free.o

bj)

类似错误,请使用与原库文件相同的运行时库(如统一多线程调试 DLL (/MDd))进行编译

引用通告地址: 点击获取引用地址
评论: -8 | 引用: 0 | 阅读: 4251
发表评论
昵 称: 密 码:
网 址: 邮 箱:
选 项:    
头 像:
内 容: