【发布时间】:2016-10-23 12:37:56
【问题描述】:
假设你有以下sn-p的代码:
include <stdio.h>
size_t nodeID = 5;
printf("nodeID = %lu", nodeID);
这将在 64 位系统上运行而不会引发任何警告,但会在 32 位系统上为 %lu 生成转换警告。
我们可以使用%z modifier处理它
但是,这在使用“I”修饰符的 Visual Studio 上不起作用。
是否有任何可用的方法以独立于架构和独立于操作系统的方式解决这个问题?
【问题讨论】:
-
如果
nodeID在所有 CPU 环境中都具有相同的大小不是更好吗?您可以声明它uint64_t或uint32_t,这样程序就不会改变行为,如果不希望它在 x86 和 x64 上以不同方式运行。 -
您可以编写自己的 10 格打印方法。
-
"%zu"格式应该是标准且独立的方式。不幸的是,Visual Studio C 编译器不得不长期跳过以下标准。不过,最后几个版本(2013 和 2015)应该完全兼容 C99。 -
如果您想编写符合标准的现代 C 代码,解决方案很简单:使用符合标准的现代编译器和库。 MSVC 及其标准库自 17 年以来没有 2 个版本的标准。
-
@Someprogrammerdude: 1) MS 明确表示他们将不支持 C99。 C 功能在 C++ 中也没有。例如,这包括 VLA。 2) C 标准是 C11,现在已经 5 岁了,他们声明(但不保证)他们只想支持 C11。问题是例如VLA 在 C11 中是可选的,尽管委员会强烈致力于向后兼容 - 巧合吗?谁知道...
标签: c