有一条规则规定,不应该在C或C ++中定义或使用以下划线后跟大写字母开头的标识符,例如_Foo
。这是因为这些标识符由编译器保留,因此可能会与某些编译器代码冲突并导致未定义的行为。
尽管这条规则众所周知并被许多编码标准采用,但我从未见过这样的规则本可以防止大量损害的现实生活情况。
有人知道违反此规则的现实例子吗?编辑:我正在谈论编译和链接良好的代码,但由于这一点显示出意想不到的行为。
答案 0 :(得分:3)
我在一个系统上工作,我们的应用程序代码有一个函数_bind()
(用于绑定SQL语句中的宿主变量),这个函数不是静态的,因此它是公开可用的。
在一个操作系统的一个修订版(至少)上(我忘了它;它在上一个千年中都是),系统提供了一个函数_bind()
- 惊讶,惊讶 - 有一个不同的界面和做了不同的工作(绑定到IP地址或其附近的套接字)。当应用程序代码与系统库链接时,系统库代码在尝试建立网络连接时最终调用我们的_bind()
函数。事情进展不顺利。
我们要么重命名该功能,要么将其设置为静态(或两者),问题就消失了。现代共享库可以最大限度地减少发生此类事件的可能性。我们的代码使用静态库,我认为O / S也使用静态C库(很久以前!)。使用共享库可以改变动态。
忽略了大量模糊细节的伪造信息 - 这种情况往往是一个短暂的问题,因为人们很快就会修复它们。