2016-10-23 48 views
3

一个为size_t假设你有下面的代码片段:打印在一个独立于操作系统的架构无关的方式

include <stdio.h> 
size_t nodeID = 5; 
printf("nodeID = %lu", nodeID); 

这将没有任何警告的情况下被提出的一个64位系统上,但会生成%的转换警告在32位系统上。

我们可以使用%z modifier

然而,这并不在Visual Studio中,它使用“我”的修改工作,对付它。

是否有任何方法可以解决这两个独立于架构和独立于操作系统的方式?

+0

如果在所有的CPU环境中'nodeID'确实具有相同的大小,会不会更好?你可以声明'uint64_t'或'uint32_t'这个程序不会改变行为,如果不希望它在x86和x64上运行不同的话。 –

+0

你可以用10个分区编写自己的打印方法。 –

+2

''%zu''格式应该是标准和独立的方式。不幸的是,Visual Studio C编译器不得不根据以下标准跳过。最后几个版本(2013和2015)应该具有完整的C99兼容性。 –

回答

5

正如你所说,你可以使用z修改:

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

但就像你说的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); 

另一种方式,它是独立在这个意义上,它并没有在文件依赖条件预处理宏架构和操作系统,将是:

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

这显然依靠size_t是小于或等于长度为64位,我相信它始终是。

+1

“......我相信它总是如此。” - Believe是一个糟糕的编程顾问。没有上限。如果没有'%zu',就没有完全合规的方式 - 这就是为什么'%zu'被引入的原因。 – Olaf

+1

由于'size_t'不能大于'uintmax_t',所以可以强制使用'uintmax_t'并使用'PRIuMAX'来获得正确的格式字母。但是如果你有''头和'uintmax_t',那么你也有'%zu'可用的机会很高。类似的评论也适用于'uint64_t'。 –

相关问题