我愿意使用格式字符串中的%zu
说明符打印size_t
值,但是,我总是得到“zu”作为输出,而不是size_t
变量中的实际值:
size_t val = 10;
printf("val: %zu\n", val); // outputs "zu", not "10"
字符串
我已经看到,对于其他面临类似问题的人,解决方案是将C标准设置为C99或更高。
我正在用CMake构建我的项目,其中有以下行:
# Set the C standard to C11
set(CMAKE_C_STANDARD 11)
型
所以,我想我可以走了,但不,我仍然得到同样的问题。
”我可以错过一些东西吗?**
我使用以下堆栈:
- CMake版本3.22
- 使用arm-none-eabi-gcc版本10.3.1工具链进行交叉编译
- 编译标志:
-Os -g -ffunction-sections -fdata-sections -fno-common -fmessage-length=0 -mcpu=cortex-m4 -mthumb -mthumb-interwork -mlittle-endian -mfloat-abi=hard -mfpu=fpv4-sp-d16
个
我还添加了-std=c11
编译选项以防万一。还是不管用。
2条答案
按热度按时间dffbzjpn1#
我是不是漏掉了什么?
您正在使用的Newlib标准C库实现禁用
size_t
,并且在其“nano”版本的printf
中禁用long long
。uqxowvwt2#
目标系统上使用的C库不支持格式长度修饰符
z
。要么它太旧了,不支持C99扩展,要么它被故意削弱以保存一些(相当少的)代码量,只支持%d
,%u
和%x
。您应该将size_t
值转换为(unsigned)
并使用%u
:字符串