@
thedrwu 背景常识:.h 这种 header 的地位在 ISO C++里是 deprecated ([depr.c.headers]),但是 deprecated 也同样是 [要求] 提供,懂?
一个完整的 ISO C++实现里就包含 math.h ,你要是实现标准库不提供 math.h ,管你是不是同时支持其它语言,就没资格当一个 C++的 hosted implementation 。连这点 conformance requirement 都不明白,杠就别抬了。
顺带,倒不需要我特别数落你,WG21 的人自己也有拎不清的。
比如微软的标准库实现的 Stephan T. Lavavej (因为他本人执意把这个实现叫做 STL ,为避免歧义,这里就不用类 TDN 表记法了)曾认为:
D.5 "C standard library headers" [depr.c.headers]
Why is this even deprecated?
——WG21 N4190
他不懂标准化过程中,deprecated 表示 formal discouraged ,也就是不建议用,只是为了兼容等原因保留。
这仍不表示<cname>比<cname.h>更长寿。事实上,WG21 P0063 更新 C99 兼容 header 到 C11 的同时,反倒是加上了:
The use of any of the C++ headers <ccomplex>, <cstdalign>, <cstdbool>, or <ctgmath> is deprecated.
这在 C++17 起生效。
之后,在 P0619R4 中,这个问题被重新讨论:
D.5 C standard library headers [depr.c.headers]
strong recommendation: Undeprecate the remaining [depr.c.headers] and move it directly into 20.5.5.2 [res.on.headers].
Weak recommendation: In addition to tbe above, also remove the corresponding C headers from the C++ standard, much as we have no corresponding <stdatomic.h>, <stdnoreturn.h>, or <threads.h>, headers.
Toronto Review: No recommendation, take no action without a more detailed paper.
结论是 C++20 仍然保持现状不变。
在 P2139 中,这再次被拉出来鞭尸:
D.9 C headers [depr.c.headers]
Strong recommendation(A): Remove the vacuous headers, then undeprecate the remaining [depr.c.headers] and move directly into 16.5.5.2 [res.on.headers].
strong recommendation (B): Undeprecate the remaining [depr.c.headers] and move directly into 16.5.5.2 [res.on.headers].
Weak recommendation: Remove entirely from C++23.
可见即便是到了现在,移除仍然不是主流意见。
而另一方面,是不是 C++先不说,什么时候容忍用.h 过 review ,是不同的问题,应该分类讨论。
例如很多.h 在 POSIX 中提供扩展(像_r 这样的 reentrant routines ),如果你用<cname>,这是不保证提供的,因此是错的,漏了<cname.h>应该不能通过 review 才对。
而就<math.h>,真正的问题远远更琐碎。用<cmath>代替<math.h>不能纠正误用 abs 代替 std::abs 或 std::fabs 这样的经常更危险的错误(效果倒是跟这里 OP 的问题类似),尽管 Clang++的[-Wabsolute-value]可能会指出这种问题。
我不指望随便一个 C++用户比如你是这方面的专家,但笼统以错误的认知装作适格者来 review ,先不说态度,这看起来就是在凑工时捣乱。