C++预处理器定义
C++ Preprocessor definitions
有人能定义什么是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
相关文章:
- #定义c-预处理器常量..我做错了什么
- 如何摆脱为条件编译定义预处理器宏的需要?
- C 预处理器 - 现有定义的预置路径
- VS2015 预处理器定义与点
- 如何在编译时定义C++预处理器指令的值?
- 将预处理器配置定义迁移到 constexpr,而不会造成内存膨胀
- Cygwin下的gcc 9.3.0预处理器:cmdline -Dname,但名称似乎未定义
- 宏定义中的预处理器令牌两边有两个双引号
- FFTW_GNUC_未定义为预处理器宏
- 替换预处理器定义中的字符
- CMake 正在删除预处理器定义
- 在宏中定义然后取消定义预处理器变量
- "unix" C++预处理器宏未定义 -std=c++11
- 预处理器,在未定义时将宏扩展为无
- CMAKE CHECKCSOURCECOPILE将预处理器定义传递给Armlink
- Tensorflow 如何定义预处理器宏?
- 是否可以使用字符串检查预处理器定义
- 如何设置此视觉工作室 (2015) 自定义生成步骤(工具?基本上,我想要一个修改头文件(c ++)的预处理器步骤
- 如何使用算术生成预处理器定义?
- 用于在 Visual Studio 中为整个项目或解决方案定义带有参数的预处理器宏的选项