【问题标题】:Why is there a sequence point immediately before library functions?为什么在库函数之前有一个序列点?
【发布时间】:2020-06-02 18:33:45
【问题描述】:

标准是这样说的:

在库函数返回之前有一个序列点。 C17dr § 7.1.4 3.

我知道在实际调用之前和返回语句之后有一个序列点(由于分号,如果有其他原因请告诉我)但我无法理解上面的句子。谁能解释一下?

【问题讨论】:

  • 是的,但我不明白这个“库函数没有标准涵盖的实现它们的代码(它们甚至可能没有在 C 中实现)”部分答案。
  • @UlaşSezgin 你不明白那句话的哪一部分?它回答了你的问题
  • 我认为关键是我们知道在return 语句之后有一个序列点,但我们不能保证库函数实际上包含return 语句或任何声明,因为它可能不是用 C 编写的。

标签: c function sequence-points c-standard-library


【解决方案1】:

这意味着你可以编写像t = sqrt(t) 这样的代码。如果你不能这样做,那将是真的烦人。

如果 C 标准不保证函数在返回之前具有排序点,则上述行为将是未定义的。

请注意,C 标准库函数可能由编译器硬编码 - 所以这是一个重要的考虑因素。它还为标准库实现的用户增加了额外的保护,标准库实现可能将某些功能实现为宏(这是允许的,但需要遵守过多的规则)。

(请注意,该规则已沿用到 C++)。

【讨论】:

  • 现在我很好奇是否还有其他方式使库函数无法完全“像”由 C 语言函数定义实现一样。
  • 好的,但是我认为,我们可以编写这段代码,这要归功于其他的序列点规则。我们不能吗?
  • @aschepler 我想像 setjmp 和线程创建函数这样的东西肯定不能像纯 C 语言那样实现。
  • @aschepler:它还可以防止以宏实现的功能(尽管它可能是重言式)。见stackoverflow.com/questions/47029568/…
  • 当编译器对标准库内容进行硬编码时,我最开心。请给我每个平台的内联内在函数,而不需要 LTO 使函数调用消失......
猜你喜欢
  • 2018-01-30
  • 2013-04-18
  • 2021-10-18
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多