替代printf参数有限吗?

ran*_*nsh 2 c printf misra variadic-functions

Misra 2004有以下规则:

Rule 16.1: Functions shall not be defined with variable numbers of arguments
Run Code Online (Sandbox Code Playgroud)

因此,类似的功能printf不能与规则16.1一起使用.

uint32_t debug_print(char *format, ...)
{
   int int_ret_val=0;

   uint32_t ret_val = ERR_NO_ERROR;
   va_list arguments;
   va_start(arguments, format);

   ret_val = vprintf(format, arguments);

   va_end(arguments);

   return ret_val;
}
Run Code Online (Sandbox Code Playgroud)

我寻找替代方案,但没有找到任何.

用于记录字符串格式化消息(" %d,%f,..")的所有c系列命令是否都使用变量列表?

Lun*_*din 6

确实这禁止使用printf.事实上,MISRA从生产代码中禁止整个stdio.h.原因很简单,这些是有史以来为任何编程语言设计的最可怕的不安全功能.它们不存在类型安全性和多种安全/安全问题.

对于所有可变函数也是如此,即使stdio.h特别糟糕,因为它们的复杂性和对调用多种形式的未定义行为的喜爱.此外,可变参数函数带有危险的"默认参数提升"规则.

所以在任务关键型系统中忘记这些功能.

  • 在托管系统(OS)上,请使用特定于系统的API:s.
  • 在一个独立系统(没有操作系统)上,stdio开始时没有多大意义,你应该使用任何对应用程序有意义的自定义界面.