标准库实现源,没有名称uglified

时间:2013-10-05 19:15:54

标签: c++ std

阅读 C ++ 源代码显然是一种很好的学习方式,而且当它是一个你很少了解的功能时,它非常有趣。就标准库来源而言,由于名称的 uglifying ,这很难实现。

uglifying 是否在源代码包含在标准库中之前通过某种类型的源代码处理完成?如果是这样,原始源代码会发生什么?是否有任何非uglified C ++标准库源代码的存储库?

我很有兴趣特别关注 C ++ 11 和很快 C ++ 14 功能。

我无法想象以这种形式维护代码会非常有趣....

编辑:

有人建议取消此流程here

1 个答案:

答案 0 :(得分:7)

在学习标准库实现时,请首先注意标准库必须遵守某些严格的约束,这些约束不适用于普通用户编写的代码。此外,标准C ++库完成的一些操作有些深奥,我担心如果它们被普通用户的代码使用(如果你的公司有一个低级库团队,他们可能会做一些类似的事情,虽然)。特别是在约束标准库上需要遵守的是,所使用的名称都不会与用户在任何地方使用的任何名称冲突。由于用户可以定义有趣的宏,标准库需要在用户可见的上下文中使用为标准库保留的名称,例如头文件:

  • 标准C ++库中用于类,函数,枚举等的名称或其tmeplates(如适用)保留。
  • 所有以下划线后跟大写字母的名称或包含两个连续下划线的名称都保留在所有上下文中。
  • 还有一些其他保留名称,但通常不在标题中使用,因为它们通常不会在宏名称的上下文中保留。

你特意做的事情想要从标准C ++库中复制的是包含保护的命名:这些通常以一个或两个下划线开头,都是大写字符。用户允许使用任何这些标识符,除非他们被明确允许使用它们(例如,您可以使用__FILE____LINE__允许,例如,在程序中的任何位置写_FOOBAR,可以通过宏扩展(也就是说,我认为你可以写"_FOOBAR")。

回答你的实际问题:我所知道的所有标准C ++库实现(libstdc ++,libc ++,Dinkumware,RougeWave和我自己的)都使用“uglified”名称编写,并且没有程序将它们转换为这种形式。基本上,任何程序都必须处理许多不太可行的异常。我认为,标准的C ++库实现者只是习惯了有趣的名字。对于我的实现,我已经努力用一个公共前缀命名所有内容,以便可以使用简单的sed脚本撤消uglification,但我没有在任何地方都遵循该模式。