printof with sizeof on 32 vs 64 platform:如何以独立于平台的方式处理格式代码?

StackOverflow https://stackoverflow.com/questions/1403074

  •  05-07-2019
  •  | 
  •  

我有一些代码可以打印程序使用的内存量。该行类似于:

printf("The about of RAM used is %u", anIntVariable*sizeof(double) );

其中anIntVariable是double数组元素数的int变量。无论如何,在32位系统上我从来没有遇到过任何问题,但在64位系统上,我收到编译器警告使用“%u”对于无符号长整数。使用“%lu”因为格式代码修复了64位的问题但导致编译器抱怨32位,因为类型返回unsigned int。我发现,确实,sizeof(double)在32位与64位系统上返回不同的值。我发现一些网页指南将转换代码从32位转换为64位但是我宁愿让代码同时适用于两者而不是来回转换。

如何以独立于平台的方式编写此行?我知道很多方法可以使用预处理器指令来实现它,但这似乎是一个黑客攻击。当然,这是一种我没有意识到的优雅方式。

有帮助吗?

解决方案

便携式printf标识符在包含文件 inttypes.h 中提供

此包含文件具有适用于您的特定运行时的许多可移植标识符。对于您的示例,您需要PRIuPTR,这意味着“ PR intf 标识符 u 符号,其大小最多为指针的大小”。

您的例子将是:

printf("The amount of RAM used is %" PRIuPTR, anIntVariable*sizeof(double) );

带有GCC 4.3的64位Linux上的结果( int anIntVariable = 1 ):

$ gcc test.c -m32 -o test && ./test
The amount of RAM used is 8
$ gcc test.c -o test && ./test
The amount of RAM used is 8

为了完整起见,还有scanf的标识符,其前缀为SCN。

其他提示

sizeof的返回值是size_t。如果您使用的是符合C99标准的编译器,看起来您可以使用 %zd %zu

D'oh:%zu (无符号)当然。谢谢,嘿。

首先,您应该匹配“%”具有您要打印的实际数据类型的说明符。 sizeof 会返回数据类型 size_t ,就像您不应该尝试使用“%d”打印浮点数一样说明符,您不应该尝试使用“%u”打印size_t。或“%d”或任何不是真正意味着size_t的东西。

其他回复已经提供了一些很好的方法来处理新的编译器(“%z”和PRIu32),但我们以前的方式只是将size_t转换为unsigned long,然后使用"%鲁":

printf("The amount of RAM used is %lu", (unsigned long)(anIntVariable*sizeof(double)) );

这对于size_t比long更宽的系统不起作用,但我不知道任何这样的系统,我甚至不确定标准是否允许它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top