【问题标题】:Why is the format in printf_s (Annex K) marked as restrict?为什么 printf_s(附件 K)中的格式标记为限制?
【发布时间】:2023-03-17 12:28:01
【问题描述】:

我完全知道this question的存在。

但是,printf_s 将存在说明符 %n 视为错误,因此不会期望来自printf_s 的格式写入操作。 restrict 在这里有什么意义?

【问题讨论】:

  • 该帖子上接受的答案有 “由于 restrict 可能会或可能不会使代码运行得更快,但它永远不会让它变慢(假设编译器是理智的),应该始终使用它"
  • 这些项目符号用于权衡风险与收益。两者都必须使用它,即如果存在 UB 的重大风险并且没有真正的好处,请不要使用它。但是您详细说明的是缺乏未定义行为的可能性。这意味着我们留下了一个没有风险的潜在改进。所以按照最初的建议,使用它。
  • 这很令人信服,但是像 strlen 这样的其他标准库函数并不这么认为。我仍然想知道为什么printf_s 会有所不同。
  • 您必须记住,不同时期的不同人致力于特定功能的标准化。有时他们会错过可以改进的地方。

标签: c c11 restrict-qualifier


【解决方案1】:

一个指向字符类型的函数参数不仅可以给其他函数参数起别名,还可以给全局对象起别名。特别是,由于printfprintf_s 修改了stdout,原则上任何指向字符类型的指针都可以指向同一个FILE 对象或实现可能用于内部IO 的其他对象。

这有点牵强,但基本上这里的restrict 和许多其他地方都说,不要试图搞笑,并为您的格式使用单独的字符数组。

【讨论】:

  • 你的意思是标准输出可以被重定向到格式吗?怎么可能做到?
  • 未重定向,已使用。 printf((char*)stdout),否则将是一个有效调用,前提是您知道 FILE 结构中的字节包含空字符且不包含 % 字符。
  • 那么wprintf_s呢?将FILE 别名为wchar_t 会导致UB,而不管restrict 是否违反了严格的别名规则。这使得wprintf_s((wchar_t*)stdout) 没有必要妥协。
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2016-12-29
  • 2011-02-23
  • 1970-01-01
  • 2013-10-30
  • 2012-05-14
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多