![]() |
1
20
这个
|
![]() |
2
13
这里有两个问题。第一个问题是这三个平台的正确printf说明符字符串是什么。请注意
打开
Windows
,使用“
第二个问题是如何支持多个平台,因为每个平台上的格式字符串可能不同。正如其他人指出的,使用
相反,为每个目标平台分别编写一个makefile或项目文件。然后通过源文件中的某个宏名引用说明符,在每个makefile中适当地定义宏。特别是,GCC和Visual Studio都接受“D”开关来在命令行上定义宏。 如果您的生成系统非常复杂(多个生成选项、生成的源等),维护3个单独的makefile可能会变得很困难,您将不得不使用某种高级生成系统,如CMake或GNU autotools。但基本原理是相同的——使用构建系统来定义特定于平台的宏,而不是将平台检测逻辑放在源文件中。 |
![]() |
3
8
我唯一能想到的是典型的:
然后利用不断的折叠:
|
![]() |
4
4
丹萨克斯在《嵌入式系统设计》上写了一篇文章 covered 这件事。丹认为,%zu是标准的方法,但是很少有编译器支持这种方法。作为替代方案,他建议使用%lu并将参数显式转换为unsigned long:
|
![]() |
5
2
使用
|
![]() |
6
1
我不知道有什么令人满意的解决方案,但是您可以考虑使用一个专门的函数将大小项格式化为字符串,并打印字符串。 (或者,如果您可以摆脱它,boost::format可以轻松地处理这类事情。) |
![]() |
7
1
您只需找到一个具有最大存储类的整数类型,将值强制转换为该类型,然后对较大的类型使用适当的格式字符串。注意,此解决方案适用于任何类型(ptrdiff_t等),而不仅仅是尺寸。 您要使用的是uintmax和format宏PRIuMAX。对于Visual C++,你需要下载C99兼容的Stdit.h和IpType h标题,因为微软不提供它们。 另见 http://www.embedded.com/columns/technicalinsights/204700432 这篇文章纠正了弗雷德里科引用的文章中的错误。 |
![]() |
8
0
对于这个问题,我的选择是简单地将size_t参数转换为unsigned long,并在任何地方使用%lu—当然,只有在值不超过2^32-1的情况下。如果这对您来说太短,您可以将其转换为unsigned long long,并将其格式化为%llu。 不管怎样,你的琴弦永远不会笨拙。 |
![]() |
9
0
选项1:
从那以后大部分(如果不是全部?)系统
但是,重要的是您要验证这是否适用于您的特定体系结构(编译器、硬件等),因为标准没有强制执行这一点。
示例用法:
选择2:
不过,在可能的情况下,只需使用
示例用法:
但是,在一些系统上,例如使用gcc作为编译器的STM32微控制器上
选择3:
在你需要的地方
绝对保证工作
但是,如果您不确定自己的特定体系结构,可以将
示例用法:
引用的消息来源: |
![]() |
10
-1
上面的方法是最好的方法,但是如果代码还需要移植到C99之前的平台,请将值转换为一些宽类型。
或使用条件代码
最后考虑
|
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |
![]() |
OverHeaven · 在2D数组中打印每行两次-C 3 年前 |
![]() |
user16218933 · php上没有显示图像 3 年前 |
![]() |
Sinayra · 循环中的strcat()与sprintf() 7 年前 |
![]() |
obvionaoe · printf()在错误的位置打印换行符 7 年前 |
![]() |
ByteMe95 · 错误的printf类型仍在打印正确的值 7 年前 |
![]() |
141_MATRIX_141 · 指针C的值 7 年前 |