C++ &引用;输入/输出库<;标准h>;不得使用。”;

C++ &引用;输入/输出库<;标准h>;不得使用。”;,c++,coding-style,C++,Coding Style,我在读第22条规则,规则说: AV规则22(MISRA规则124,修订版) 不得使用输入/输出库 是否有任何理由不使用 我知道这些规则适用于C++,我们可以使用。。。但是有什么问题?最明显的问题是printf、scanf,以及它们的各种近亲(例如sprintf)中缺乏类型安全性 除了类型安全问题之外,scanf和sprintf系列也使得防止缓冲区溢出变得相当困难。这是可以做到的,但这不是小事,而且似乎只有极少数C程序员知道如何处理这类任务。最明显的问题是printf,scanf,以及它们的各种兄

我在读第22条规则,规则说:

AV规则22(MISRA规则124,修订版)

不得使用输入/输出库

是否有任何理由不使用


我知道这些规则适用于C++,我们可以使用
。。。但是
有什么问题?

最明显的问题是
printf
scanf
,以及它们的各种近亲(例如
sprintf
)中缺乏类型安全性


除了类型安全问题之外,
scanf
sprintf
系列也使得防止缓冲区溢出变得相当困难。这是可以做到的,但这不是小事,而且似乎只有极少数C程序员知道如何处理这类任务。

最明显的问题是
printf
scanf
,以及它们的各种兄弟(例如
sprintf
)中缺乏类型安全性


除了类型安全问题之外,
scanf
sprintf
系列也使得防止缓冲区溢出变得相当困难。这是可以做到的,但它不是微不足道的,而且似乎只有极少数C程序员知道如何处理这类任务。

时不时地会有这样的问题,关于为什么一些编码标准要求这样或那样

正确的答案应该是:无论编码标准的作者想要什么。有时,编码标准给出了其规则的理由;这个显然不是。因此,我们只能猜测你的问题的答案可能是什么

因此,我将补充我自己的猜测:

飞行器听起来像是非常严肃的业务,具有极高的正确性和健壮性要求
printf
scanf
等使编写代码变得容易,这些代码愉快地通过了编译器,但在运行时会产生未定义的行为

<>这些C函数对普通C++流有一个好处:格式字符串使编写国际化代码更容易。考虑一下这个例子,使用一个<代码> STD::oSoos某些UI组件,例如客户管理应用程序中的一个按钮标签:

os << "Update customer\n";
根据应用程序的语言设置,此类
FormatString
函数可能返回
“更新%s”
“%s aktualisieren”

不过,这是非常危险的。事实上,如果我上面的例子中的
customer\u name
std::string
,那么您已经有了未定义的行为

像这样的库试图将格式字符串的灵活性与流的类型安全性结合起来

回到你的实际问题,我的猜测是,关于国际字符串的灵活性在飞行器业务中不是一个大问题


如您所见,编码标准的每个方面都可以进行详细讨论。单个规则的原因可能并不总是那么明显,它们通常与编写标准的应用程序域有关


如果你不能问编码标准的作者,那么你的问题就无法得到真正的回答。

不时会有这样的问题,关于为什么一些编码标准要求这样或那样

正确的答案应该是:无论编码标准的作者想要什么。有时,编码标准给出了其规则的理由;这个显然不是。因此,我们只能猜测你的问题的答案可能是什么

因此,我将补充我自己的猜测:

飞行器听起来像是非常严肃的业务,具有极高的正确性和健壮性要求
printf
scanf
等使编写代码变得容易,这些代码愉快地通过了编译器,但在运行时会产生未定义的行为

<>这些C函数对普通C++流有一个好处:格式字符串使编写国际化代码更容易。考虑一下这个例子,使用一个<代码> STD::oSoos某些UI组件,例如客户管理应用程序中的一个按钮标签:

os << "Update customer\n";
根据应用程序的语言设置,此类
FormatString
函数可能返回
“更新%s”
“%s aktualisieren”

不过,这是非常危险的。事实上,如果我上面的例子中的
customer\u name
std::string
,那么您已经有了未定义的行为

像这样的库试图将格式字符串的灵活性与流的类型安全性结合起来

回到你的实际问题,我的猜测是,关于国际字符串的灵活性在飞行器业务中不是一个大问题


如您所见,编码标准的每个方面都可以进行详细讨论。单个规则的原因可能并不总是那么明显,它们通常与编写标准的应用程序域有关


如果您无法询问编码标准的作者,这个问题的C++标准是引用了MISRA-C:1998,这两个都与C< P>的使用有关。这个JSF-C++标准引用了MISRA-C:1998,这两个与锥推理的使用有关的问题可能是它通常不像C++流一样是类型安全的。具体的编码标准,您必须询问洛克希德·马丁公司。参考MISRA-C提供了基本原理。参见MISRA-C.COMONE的原因可能是它一般不象C++流那样安全。对于这些特定的编码标准背后的实际原理,您将不得不询问洛克希德·马丁公司。
os << InternationalString(id_update) << " " << customer_name << "\n";
sprintf(s, FormatString(id_update_customer), customer_name);