以与OS无关的体系结构独立方式打印size_t

ber*_*kie 3 c

假设您有以下代码片段:

include <stdio.h>
size_t nodeID = 5;
printf("nodeID = %lu", nodeID);
Run Code Online (Sandbox Code Playgroud)

这将在64位系统上没有任何警告的情况下运行,但会在32位系统上生成%lu的转换警告.

我们可以使用%z修饰符来处理它

但是,这对使用"I"修饰符的Visual Studio不起作用.

有没有可用的方法以独立于体系结构和独立于操作系统的方式解决这个问题?

abl*_*igh 5

如你所说,你可以使用z修饰符:

#include <stdio.h>
size_t nodeID = 5;
printf("nodeID = %zu\n", nodeID);
Run Code Online (Sandbox Code Playgroud)

虽然正如你所说IIRC,这可能与旧的MS编译器存在兼容性问题.你可以通过以下方式解决这个问题:

#ifdef _MSC_VER /* Untested MSC detection */
#define PRIuSIZE Iu
#else
#define PRIuSIZE zu
#endif
#define QUOTE(name) #name
#define STR(macro) QUOTE(macro)
#define USIZE_STR STR(PRIuSIZE)

#include <stdio.h>
size_t nodeID = 5;
printf("nodeID = %" USIZE_STR "\n", nodeID);
Run Code Online (Sandbox Code Playgroud)

另一种方式,这是建筑和OS独立在这个意义上,它不依赖于条件预处理宏文件,应该是:

#include <stdio.h>
#include <inttypes.h>
size_t nodeID = 5;
printf("nodeID = %" PRIu64 "\n", (uint64_t) nodeID);
Run Code Online (Sandbox Code Playgroud)

这显然要依赖于size_t小于或等于64位的长度,我相信它总是如此.