- 论坛徽章:
- 2
|
本来潜水很久了,10月份改了签名想show一下。
11月电脑坏了,修好了之后又没激情了……
但最近几天接二连三地被想念…… 还让不让人潜水啊?
喷C++成风、成流行、 成时尚…… 但你们敢喷得有技术含量一点吗?
教你们一个C++的死穴, 以后喷也有底气一些。
当然, 打算继续无脑喷, 继续秀下限也请自便
这无可奈何的死穴就是: C++没有ABI……
于是什么template, 什么exception, 什么class, 什么virtual function…… 统统都局限在一个link target,比如exe/out/dll/so什么的。
要想跨编译器? 可以的,后果自负就是了。
记得某个比较有名的库, OGRE? 仅仅因为 visual studio 是否是SP1就可以导致crash……
这是阻碍exception被实际使用的技术性原因之一。
如果打算二进制兼容, 又想使用exception, 就只能:
内部使用exception, 包括将调用的外部函数返回的status转换为exception, 以及对外将exception转换为status……
这种代码一点趣味都没有……
我说那些拿着 google coding style就开喷的, 这文档你们到底看了还是没看?
丢失上下文啊什么的真不是理由。 因为status同样会丢。因为E不能完成S也不能完成的事, 就说E不好? 这是什么逻辑啊……
要额外手工地记录上下文? 有办法的, 比如boost exception 。
我倒是好奇用 status 该怎么办啊怎么办……
但boost exception其实我并不看好。 这涉及到一个问题: 记录上下文意味着什么?
就拿文档中Motivation里面的例子来说, 为什么只记录filename,"foo.txt" 而不记录 filemode "rt" ? 万一底层其实需要的是binary mode打开呢?
丢了这个信息, 更上层又怎么知道问题出在这里? 也就是说, "rt" 也需要一并记录。
因此, 所谓的需要上下文才能处理错误, 这个上下文其实就是C与C++都不提供的stack trace……
与其boost exception,并且代码又变为许多地方都要try catch, 完全丢失了exception的优势…… 还不如让语言直接提供可选的stack trace。 |
|