我的问题源于在尝试构建多个位深度平台(例如32/64)时尝试使用printf来记录事物。
一直在养成丑陋头脑的问题是尝试在多种体系结构上打印。 在32位上它会是这样的
printf(" my int: %dn", myInt);
但在64位上,它必须改为
print (" my int: %ldn", (long)myInt);
我有两个相关的问题:
谢谢你的任何澄清。
关于printf
:在您选择的情况下,“%d”必须按规范处理平台定义的“int”数据类型。 无论是32位,64位还是128位线性AS / 400值都无关紧要。 如果要将值提升为更大的字段类型(并将该促销与相关格式字符串粒子匹配),您当然可以自由地这样做,
int a=0; printf("%ld", (long)a);
肯定是使用促销定义的行为。
我认为你的问题的真正关键在于以下情况,以及强制促销是否可以“解决”出现的任何问题。 例如:
char ch = 'a'; printf("%d", ch);
或者说:
char ch = 'a'; printf("%ld", (long)ch);
或者这个(这是你似乎试图避免的真实情况):
char ch = 'a'; printf("%ld", ch);
第一个将起作用,但这只是因为在va-arg列表中推送的任何堆栈的最小大小是int
的平台大小。 编译器会自动将值提升为int。 由于“%d”期望一个平台int
将显示良好。
第二个将始终工作,并得到完全支持。 从char
到long
有明确的定义促销。 即使long
64位(或更大),它仍然可以工作。
第三个是UB。 printf
正在查找很long
并且只会显示一个int
字节。 如果这似乎在您的平台上“工作”,那么检查您的平台宽度为int
和long
。 它可能“工作”只是因为你的平台long
和int
是相同的位宽。 当将代码移植到它们不是的平台时,它会带来有趣的惊喜,并且由于它是通过va-arg推送的,所以在真正的不同宽度进入游戏之前你不会看到它。
所有这一切,现在抛出一个实际的地址 (什么,真的),如scanf
所要求的,我们正在寻找完全不同的东西。
int val; sscanf("%ld",&val);
这是一个等待发生的seg-fault。 就像上面一样,如果您的平台long
和platform int
的宽度相同,您将永远不会知道它。 将此代码带到一个框中,其中long
和int
的大小不同,并为随后的核心文件的gdb加载做好准备。
你说:
一直在养成丑陋头脑的问题是尝试在多种体系结构上打印
通过传入不属于该类型大小的值来尝试获取类型问题是危险的,是的。 这就是编译器警告你的原因。 似乎导致你出现问题的便携性概念并不是为了让printf感到高兴。
它旨在使您的程序运行,而不是在多个体系结构上崩溃。 如果您有特定于平台的代码,则应使用#ifdef宏来解决它。
否则你正在掷骰子试图分层内存级别类型转换。
printf是一种便利而非类型转换方法。
看起来你专注于整体 – 你可能会侥幸逃脱。 但总的来说,我不会依赖这样的技术。
_Bools
/ _Bools
, chars
和shorts
在传递给varivadic函数(如printf()
)时首先转换为int
(如果此转换保留值,则保留为unsigned int
printf()
。 类似地, floats
转换成doubles
。
因此,如果你传递小于int
东西, printf()
会抓住整个(unsigned) int
而没有任何问题(除非传递的值实际上是unsigned int
而你用%d
而不是%u
打印它,你得到未定义的行为)。
其他类型,AFAIR,不进行此类转换。
这一行:
print (" my int: %ldn", (long)myInt);
是不是通过这条线购买任何东西:
printf(" my int: %dn", myInt);
两者都有效,结果几乎相同。 唯一的区别是前者可能导致更大的代码和更长的执行时间(如果sizeof(long) >= sizeof(int)
)。
(长)在32位架构中并不意味着64位。 这标志着(漫长的)。
需要了解更多c/c++开发分享在printf参数中提升类型是危险的吗?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享在printf参数中提升类型是危险的吗?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979837.html