我在一个受限的嵌入式系统上工作。
目前我们使用snprintf
到缓冲区,然后用另一个语句,将缓冲区打印到串口:
char temp_buffer[256];
int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer),
"Solar system has %d planets\n",
10);
if (bytes_written > 0)
{
Serial_Port_Output(temp_buffer, bytes_written);
}
我想切换到printf
直接写入串口。根据我们的编译器文档,我拦截了用于输出数据以使用串行端口的函数调用。 (该接口(interface)使用 block 写:地址和字符数)。
printf
函数可以使用字符缓冲区进行格式化,例如将整数或 float 转换为文本。
问题:
printf
用于格式化的缓冲区在哪里? (其他 在我进行更改之前,好奇的人想知道。)- 这是编译器(平台)相关问题吗?
平台:Arm7tdmi 处理器、片上系统 (SOC)、IAR EW 编译器。
最佳答案
这完全是特定于实现的。 printf
没有义务使用任何缓冲区。当然,它拥有与 FILE
关联的 stdio 缓冲区(stdout
在 printf
的情况下),但这可能是零长度如果程序使用 setbuf
/setvbuf
关闭缓冲。 printf
也有可能有一个内部缓冲区;对于正确的 C 实现,这需要有自动存储(“在堆栈上”),但是没有线程的低质量嵌入式存储可能使用静态缓冲区。在任何情况下,printf
都被指定为通过重复调用 fputc
来工作,并且它当然可以在没有任何缓冲区的情况下以这种方式实现。
关于c++ - printf 的格式化缓冲区在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182415/