0

谁能定义什么是流浪定义?.第二个问题是:我在他说我们不应该定义术语DEBUG的书中阅读“在21天内自学c ++”。我想知道为什么?

4

1 回答 1

7

问题的第一部分:

杂散定义是一个预处理器定义,它改变了一些其他代码(或实际代码)的行为,这很可能不是有意的。例如,您可以编写一个头文件并使用以下行:

#define main is_awesome

这不会对您的头文件产生任何直接影响,甚至可能不会在您的代码中产生任何影响,但是在包含该函数的文件中包含此头文件的其他人int main(int argc, char **argv)会遇到问题,因为这个杂散定义int is_awesome(int argc, char **argv)突然将该函数的名称更改为应用程序不再有main入口点!

以类似的方式,宏DEBUG可能会导致此类问题。通常,DEBUG只能由编译器本身定义,具体取决于它是否正在构建调试代码(根据您的编译器,您可能还必须自己设置它)。如果您DEBUG自己定义某个地方,即使您实际上是在创建发布版本,您也可能会触发调试代码。

通常,此类错误或问题很难追踪,尤其是如果您不知道如何查看预处理代码(您看不到基本代码中的问题/错误和最有可能的行号)报告也将关闭)。


如何避免这种情况?三个简单的规则将使您和他人的生活更轻松:

  • 仅在确实需要时使用预处理器定义(例如,在编译时控制代码包含)。
  • 始终清理#undef头文件之外不需要的 ( ) 预处理器定义。
  • 如果您必须使用一些全局预处理器定义,请使其名称唯一,例如通过添加库或项目名称。例如,DEBUG您可以使用MYLIB_DEBUG.
于 2013-08-29T23:42:47.003 回答