由以下划线开头的标识符引起的错误的真实示例



有一条规则规定,不应在 C 或 C++ 中定义或使用以下划线后跟大写字母开头的标识符,例如_Foo.这是因为这些标识符由编译器保留,因此可能会与某些编译器代码冲突并导致未定义的行为。

尽管此规则众所周知并被许多编码标准采用,但我从未见过此规则可以防止大量损坏的真实情况。

有人知道违反此规则的真实例子吗?编辑:我说的是编译和链接良好的代码,但因此显示出意外的行为。

我在一个系统上工作,其中我们的应用程序代码有一个函数_bind()(用于在SQL语句中绑定主机变量),该函数不是静态的,因此它是公开可用的。

在一个操作系统的修订版(至少)上(我忘记了是哪个;都是在上个千年),系统提供了一个功能_bind()- 令人惊讶,令人惊讶 - 具有不同的界面并完成不同的工作(将套接字绑定到IP地址,或大约)。 当应用程序代码与系统库链接时,系统库代码最终在尝试建立网络连接时调用了我们的_bind()函数。 事情进展不顺利。

我们要么重命名函数,要么将其设置为静态(或两者兼而有之),问题就消失了。 现代共享库最大限度地减少了此类事情发生的可能性。 我们的代码使用静态库,我认为 O/S 也使用静态 C 库(那是很久以前的事了! 使用共享库会改变动态。

省略了许多模糊细节的杜撰信息——这种事情往往是一个暂时的问题,因为人们很快就修复了它们。

相关内容

最新更新