VS.net++编译器编译警告:vc70.pdb、 从“size_t”到“type”的转换可能丢失数据等问题的解决办法
作者: 火车头 日期: 2008-03-25 15:21
情况1:warning C4267: “初始化” : 从“size_t”转换到“int”,可能丢失数据
如果使用 /Wp64 进行编译,或者在 64 位操作系统上编译,则在为 64 位目标程序编译时,type 为 32 位而 size_t 为 64 位。
要修复此警告,请使用 size_t而不是 type。
下面的示例生成 C4267。
- // C4267.cpp
- // compile with: /W3 /Wp64
- #include <Windows.h>
- void Func(int i) {}
- void Func2(DWORD i) {}
- void Func3(size_t i) {}
- int main() {
- size_t bufferSize = 10;
- Func(bufferSize); // C4267
- Func2(bufferSize); // C4267
- Func3(bufferSize); // OK
- }
在 x86 上也会发生 C4267,此警告无法在代码中解决,但可以使用 warning 杂注予以忽略和取消。
在这种情况下,C4267 是由 /Wp64 警告中的限制引起的。在 x86 上,因为 size_t 是 Win32 上的 unsigned int,因此 std::cout<<range_index 解析为接受 unsigned int 的 operator<< 的重载。发生 C4267 的原因是将 size_t 作为 unsigned int 参数传递,这会导致 Win64 上的截断,在 Win64 中,size_t 为 64 位,而 unsigned int 仍为 32 位。可以忽略此警告,原因如下:如果在 Win64 中进行编译,std::cout<<range_index 将解析为接受 unsigned __int64 的 operator<< 的重载,因为类型 size_t 在 Win64 上就是该类型。32 位编译器未注意到这一点,因此会发出警告。
下面的示例生成 C4267。
- // C4267_b.cpp
- // compile with: /W3 /Wp64 /EHsc
- // processor: x86
- #include <fstream>
- #include <vector>
- using namespace std;
- int main() {
- ofstream outputfile;
- vector<char> vecbuffer(10);
- outputfile.write( &vecbuffer[0], vecbuffer.size() ); // C4267
- }
情况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))进行编译
订阅
上一篇
返回
下一篇