C++ 对于%x printf说明符,long类型的参数是否可以?

C++ 对于%x printf说明符,long类型的参数是否可以?,c++,printf,variadic-functions,C++,Printf,Variadic Functions,我是在以下网站上找到的: 打印的文件SCardIsValidContext-%x\n,lReturn;行正在将LONG的LONG typedef类型的参数传递给printf,其中printf根据需要无符号int。这是定义明确的行为吗?如果是,它是否与显式静态转换为unsigned int相同?printf%x,LONG101;在Windows中有效且定义良好,其中LONG是“32位有符号整数,与int相同,大小与无符号int相同” 使用C++类型的便携等价物是Prtff%Lx,未签名的Lang1

我是在以下网站上找到的:

打印的文件SCardIsValidContext-%x\n,lReturn;行正在将LONG的LONG typedef类型的参数传递给printf,其中printf根据需要无符号int。这是定义明确的行为吗?如果是,它是否与显式静态转换为unsigned int相同?

printf%x,LONG101;在Windows中有效且定义良好,其中LONG是“32位有符号整数,与int相同,大小与无符号int相同”

使用C++类型的便携等价物是Prtff%Lx,未签名的Lang101L;p> printf%x,LONG101;在Windows中有效且定义良好,其中LONG是“32位有符号整数,与int相同,大小与无符号int相同”

使用C++类型的便携等价物是Prtff%Lx,未签名的Lang101L;p> 对于%x printf说明符,long类型的参数是否可以

不,C++中不正确。%.x代表无符号整数,不代表长整数

这是定义明确的行为吗

不,这是未定义的行为。引用C标准草案,其中定义了格式说明符:

x、 x无符号int参数转换为。。。无符号十六进制表示法

如果任何参数不是相应转换规范的正确类型,则行为未定义

在windows中,如果系统记录了这样的内容,这可能是正常的,但依赖这样的保证将无法移植到其他系统。我怀疑这个例子不是为了证明这种格式说明符滥用的有效性,而是出于偶然

对于%x printf说明符,long类型的参数是否可以

不,C++中不正确。%.x代表无符号整数,不代表长整数

这是定义明确的行为吗

不,这是未定义的行为。引用C标准草案,其中定义了格式说明符:

x、 x无符号int参数转换为。。。无符号十六进制表示法

如果任何参数不是相应转换规范的正确类型,则行为未定义


在windows中,如果系统记录了这样的内容,这可能是正常的,但依赖这样的保证将无法移植到其他系统。我怀疑这个例子不是为了证明这种格式说明符误用的有效性,而是出于偶然。

是%x有效还是%lx或两者都有效?@Ayxan,考虑到Windows是如何定义类型的,预计不会很快改变,因为它会破坏整个Win32 API。有趣。我这样问是因为cppreference说,如果后面的任何参数不是相应转换说明符所期望的类型,或者如果参数少于格式所需的参数,则行为是未定义的。虽然大小匹配,但类型仍然不匹配。所以,我不确定。也许我遗漏了什么。@Ayxan在printf中使用带符号int的%x确实是UB,正如Win32 API正在使用的C中所阐述的那样。我不知道有任何Windows编译器不符合这种构造的预期,但从技术上讲,这仍然是一种语言冲突。我猜是printf%x,lReturn+0ul;可以解决这个问题。是%x有效,还是%lx或两者都有效?@Ayxan both,考虑到Windows如何定义类型,该类型预计不会很快更改,因为它会破坏整个Win32 API。有趣。我这样问是因为cppreference说,如果后面的任何参数不是相应转换说明符所期望的类型,或者如果参数少于格式所需的参数,则行为是未定义的。虽然大小匹配,但类型仍然不匹配。所以,我不确定。也许我遗漏了什么。@Ayxan在printf中使用带符号int的%x确实是UB,正如Win32 API正在使用的C中所阐述的那样。我不知道有任何Windows编译器不符合这种构造的预期,但从技术上讲,这仍然是一种语言冲突。我猜是printf%x,lReturn+0ul;这是标准+1的正确答案,虽然本质上是int n;无符号k=*无符号*&n;是UB,我觉得有点奇怪。@dxiv它没有说明如何将有符号整数重新解释为其定义良好的无符号对应项。对,但printf可能会执行类似无符号k=va_args的操作,当它命中%x时为无符号,我所知的所有实现都会将其转换为k=*无符号*无效*args。最后,UB从写int的地址中读取一个无符号。这是标准+1的字母的正确答案,虽然这基本上是说int n;无符号k=*无符号*&n;是UB,我觉得有点奇怪。@dxiv它没有说明如何将有符号整数重新解释为其定义良好的无符号对应项。对,但printf可能会做一些类似无符号k=va_args的事情,当它到达%x时是无符号的,以及我所知道的所有转换实现 到k=*未签名*void*args的值。最后,UB从写入int的地址中读取一个无符号。
// Check the smart card context handle.
// hContext was set previously by SCardEstablishContext.

LONG    lReturn;
lReturn = SCardIsValidContext(hContext);
if ( SCARD_S_SUCCESS != lReturn )
{
   // Function failed; check return value.
   if ( ERROR_INVALID_HANDLE == lReturn )
       printf("Handle is invalid\n");
   else
   {
       // Some unexpected error occurred; report and bail out.
       printf("Failed SCardIsValidContext - %x\n", lReturn);
       exit(1);  // Or other appropriate error action.
   }
}
else
{
   // Handle is valid; proceed as needed.
   // ...
}