在使用/ Wp64进行编译时,如何在没有警告的情况下将strlen的结果转换为int

时间:2008-10-14 14:23:24

标签: c++

int l = strlen(s);

警告C4244:'=':从'__w64 int'转换为'int',可能会丢失数据

我需要用内联函数替换strlen int l = new_strlen(s);

但是如何在没有警告的情况下将strlen的结果移植到int中,并且不使用pragma?我可以保证我的字符串中不超过20亿个字符!

所有明显的事情,如reinterpret_cast,static_cast也会产生错误或警告。

编辑:唉。一个c风格的演员:(int)确实有效。我确信它没有。

7 个答案:

答案 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
     

(msvc specific)

答案 6 :(得分:0)

  

我需要用一个替换strlen   内联函数int l = new_strlen(s);

请注意,在VC ++中,构建优化版本时,strlen会自动替换为内联版本。