标识符以下划线开头导致的错误的真实示例

Pau*_*sen 6 c c++ standards identifier

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

尽管这条规则众所周知并被许多编码标准采用,但我从未见过这种规则可以防止大量损害的现实生活情况.

有人知道违反这条规则的现实例子吗?编辑:我说的是编译和链接很好的代码,但由于这个原因显示出意想不到的行为.

Jon*_*ler 3

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

\n\n

在一个操作系统的一次修订(至少)上(我忘了是哪个;这都是上个千年的事),系统提供了一个功能,_bind()\xe2\x80\x94 令人惊讶的是,令人惊讶的是 \xe2\x80\x94 有一个不同的功能接口并做了不同的工作(将套接字绑定到 IP 地址或类似的内容)。当应用程序代码与系统库链接时,系统库代码最终_bind()在尝试建立网络连接时调用我们的函数。事情进展并不顺利。

\n\n

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

\n\n

省略了许多模糊细节的伪信息 \xe2\x80\x94 这往往是一个暂时性的问题,因为人们很快就修复了它们。

\n