C++预处理器定义

C++ Preprocessor definitions

本文关键字:定义 处理器 预处理 C++      更新时间:2023-10-16

有人能定义什么是STRAY DEFINITION吗。第二个问题是:我在读《21天自学c++》一书,他说我们不应该定义DEBUG这个词。我想知道为什么?

问题的第一部分:

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

#define main is_awesome

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

以类似的方式,宏CCD_ 4可以引起这样的问题。通常,DEBUG应该只由编译器本身定义,这取决于它是否正在构建调试代码(根据编译器,您可能也必须自己设置它)。如果您自己在某个地方定义DEBUG,那么即使您实际上正在创建一个发布版本,也可能会触发调试代码。

一般来说,这样的错误或问题可能很难追踪,尤其是如果你不知道如何查看预处理的代码(你看不到基本代码中的问题/错误,很可能报告的行号也会丢失)。


如何避免这种情况?三条简单的规则会让你和其他人的生活变得更轻松:

  • 只有在必要时才使用预处理器定义(例如,在编译时控制代码包含)
  • 始终清除头文件外不需要的(#undef)预处理器定义
  • 如果您必须使用一些全局预处理器定义,请使其名称唯一,例如,在库或项目名称前加上前缀。例如,与其定义DEBUG,不如使用MYLIB_DEBUG