在 C 中使用 auto 声明变量有缺点吗?

新手上路,请多包涵

似乎 auto 是 C++11 中添加的一个相当重要的特性,它似乎遵循了许多较新的语言。与 Python 之类的语言一样,我没有看到任何显式变量声明(我不确定是否可以使用 Python 标准)。

使用 auto 来声明变量而不是显式声明它们有缺点吗?

原文由 DxAlpha 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 952
1 个回答

问题是关于 auto 的缺点,所以这个答案突出了其中的一些。使用编程语言特性(在这种情况下,与语言关键字相关联的工具)的缺点并不意味着该特性是不可接受的,也不意味着应该完全避免该特性。这意味着有缺点也有优点,因此决定使用 auto 类型扣除替代替代品必须考虑工程权衡。

如果使用得当, auto 也有几个优点——这不是问题的主题。缺点是易于滥用,以及代码以非预期或意外方式运行的可能性增加。

主要缺点是,通过使用 auto ,您不一定知道正在创建的对象的类型。在某些情况下,程序员可能希望编译器推断出一种类型,但编译器却坚决地推断出另一种类型。

给定一个像这样的声明

auto result = CallSomeFunction(x,y,z);

您不一定知道 result 是什么类型。它可能是 int 。它可能是一个指针。可能是别的东西。所有这些都支持不同的操作。您还可以通过像这样的微小更改来显着更改代码

auto result = CallSomeFunction(a,y,z);

因为,取决于 CallSomeFunction() 存在哪些重载,结果的类型可能完全不同 - 因此后续代码的行为可能与预期完全不同。您可能会在以后的代码中突然触发错误消息(例如,随后尝试取消引用 int ,尝试更改现在的 const )。更险恶的更改是您的更改通过编译器,但随后的代码以不同和未知的方式表现 - 可能是错误的 - 方式。例如(如 sashoalm 在注释中指出的那样),如果变量的推导类型将整数类型更改为浮点类型 - 并且后续代码会意外且无声地受到精度损失的影响。

因此,由于不明确了解某些变量的类型,因此很难严格证明代码按预期工作的说法是正确的。这意味着需要付出更多努力来证明在高关键性(例如安全关键或任务关键)领域中“适合目的”的主张是正确的。

另一个更常见的缺点是程序员倾向于使用 auto 作为强制代码编译的钝器,而不是考虑代码在做什么,并努力使其正确。

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题