跨平台格式字符串,用于字体大小的变量
在跨平台的c / c ++项目(Win32,Linux,OSX)上,我需要使用* printf函数来打印size_t类型的一些变量。 在某些环境下,size_t是8个字节,其他的是4个。在glibc上我有%zd,而在Win32上,我可以使用%Id。 有没有一种优雅的方式来处理这个问题?
PRIuPTR
宏(来自<inttypes.h>)为uintptr_t
定义了一个十进制格式,该格式应该总是足够大,以便可以在不截断的情况下对其施加size_t
,例如
fprintf(stream, "Your size_t var has value %" PRIuPTR ".", (uintptr_t) your_var);
这里真的有两个问题。 第一个问题是三种平台的正确printf说明符字符串是什么。 请注意, size_t
是一个无符号类型。
在Windows上,使用“ %Iu
”。
在Linux和OSX上,使用“ %zu
”。
第二个问题是如何支持多种平台,因为格式字符串等内容在每个平台上可能都不相同。 正如其他人指出的那样,使用#ifdef
会很快变得丑陋。
相反,为每个目标平台编写一个单独的生成文件或项目文件。 然后通过源文件中的某个宏名称引用该说明符,在每个makefile中适当地定义该宏。 特别是,GCC和Visual Studio都接受'D'开关来在命令行上定义宏。
如果您的构建系统非常复杂(多个构建选项,生成的源代码等),那么维护3个独立的构建文件可能会变得不实用,并且您将不得不使用某种先进的构建系统,如CMake或GNU自动工具。 但基本原理是相同的 - 使用构建系统来定义特定于平台的宏,而不是将平台检测逻辑放在源文件中。
我能想到的唯一的事情就是典型的:
#ifdef __WIN32__ // or whatever
#define SSIZET_FMT "%ld"
#else
#define SSIZET_FMT "%zd"
#endif
然后利用不断的折叠:
fprintf(stream, "Your size_t var has value " SSIZET_FMT ".", your_var);
链接地址: http://www.djcxy.com/p/72209.html
上一篇: Cross platform format string for variables of type size