为什么带有 %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
。
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
。