int l = strlen(s);
警告C4244:'=':从'__w64 int'转换为'int',可能会丢失数据
我需要用内联函数替换strlen int l = new_strlen(s);
但是如何在没有警告的情况下将strlen的结果移植到int中,并且不使用pragma?我可以保证我的字符串中不超过20亿个字符!
所有明显的事情,如reinterpret_cast,static_cast也会产生错误或警告。
编辑:唉。一个c风格的演员:(int)确实有效。我确信它没有。答案 0 :(得分:5)
const char * str = "Hello";
int len = static_cast< int >( strlen( str ) );
return len;
即使在警告级别4(VS2005)上,此代码也不会产生任何错误或警告。 你用什么编译器?
答案 1 :(得分:3)
另请注意,VS2008中不推荐使用/ Wp64;显然它是not reliable。
答案 2 :(得分:1)
施展它:
int i = (int) strlen(s);
答案 3 :(得分:1)
或者不要使用signed int。 strlen()的返回值是无符号的。
答案 4 :(得分:1)
如果您确实有充分理由截断指针,可以通过堆叠多个强制转换使/Wp64
接受您的代码。这些案件很少见。一个例子:传统PCI设备的设备驱动程序,执行DMA,内存分配低于4GB限制。 (注意:还有PtrToUlong()
宏,这会让你的意图更清晰。)
此单演员会产生警告:
const char* p = "abc";
unsigned int u = reinterpret_cast<unsigned int>(p);
wp64.cpp(10):警告C4311:'reinterpret_cast':从'const char *'到'unsigned int'的指针截断
但这些叠加的演员阵容不会:
const char* p = "abc";
unsigned int u = static_cast<unsigned int>(reinterpret_cast<uintptr_t>(p));
我无法使用我安装的编译器版本重现您的警告,但我怀疑您的问题与您将64位无符号size_t
转换为一个32位的签名int
。
如果您堆叠多个强制转换以进行64位到32位转换以及无符号到签名的转换,那么您可能会有更好的运气:
const char* s = "abcdef";
int l = static_cast<int>(static_cast<intptr_t>(strlen(s)));
此外,如果同时构建x86和x64二进制文件,则可以为32位版本禁用/Wp64
,这样就不必使用__w64
注释任何类型。使用/Wp64
进行64位构建会遇到很多错误。
答案 5 :(得分:1)
如果你理解了一个警告,那么完全可以接受警告,而不是堆叠演员或任何其他令人困惑的混乱作为解决方法。
带有的pragma警告指令 抑制说明符抑制 仅警告代码行 紧接着#pragma 警告声明。
#pragma warning( suppress : 6001 ) arr[i+1] = 0; // Warning 6001 is suppressed j++; // Warning 6001 is reported
答案 6 :(得分:0)
我需要用一个替换strlen 内联函数int l = new_strlen(s);
请注意,在VC ++中,构建优化版本时,strlen会自动替换为内联版本。