为什么带有 %llu 的 sprintf 返回字母 "lu"?

Why is sprintf with a %llu returning the letters "lu"?

uint64_t milliSeconds =getTimeMs64();
int timestringLength = 0;

timestringLength = snprintf( pBuffer, bufferSize, "%llu", milliSeconds );

嗯,我很困惑。即将进行 snprintf() 的反汇编,但我想我会同时问更聪明的人。

我只想发送这个无符号的 64 位,并得到一个字符串。相反,我得到 timestringLength == 2 并且我的缓冲区顶部有字母 lu 。我不知道这是怎么回事。

我在 Eclipse/CDT 中有 -std=c99 的构建标志,所以这不是 c90 问题。我尝试使用 long long unsigned 而不是 uint64_t.

STM32CubeMxIDE(Eclipse v20210303,CDT 10.x),GCC,为 c99 构建。可能有些愚蠢,但我想我会在有空的时候问一下。

如我所料,这很简单。在STM32CubeIDE中,有一个定义运行时库规范的编译器标志,STM或CDT调用此选项Runtime Library

如果它设置为 Reduced C (--specs=nano.specs) snprintf() 将无法处理 %llu 和其他人(我只测试了 %d 似乎确实有效)。

如果您要使用 snprintf,请将此选项设置为 Standard C