有没有办法在每个源文件中自动复制#define

时间:2009-08-25 07:48:46

标签: c++ memory-leaks macros c-preprocessor

我想在Visual C ++ 2005解决方案中的每个源文件中出现以下内容:

  #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
  #define new DEBUG_NEW

有没有办法在不手动复制的情况下执行此操作?编译器选项?

6 个答案:

答案 0 :(得分:5)

命令行选项/D可用于定义预处理程序符号。但是,我不知道它是否也可以用于定义带参数的宏,但测试它应该是一件容易的事。

编辑:如果失败,/FI option(“强制包含”)应该允许你做你想做的事。引用MSDN documentation

  

此选项与在每个源文件[...]的第一行的#include指令中使用双引号指定文件具有相同的效果。

然后,您可以将#define放入强制包含文件中。

答案 1 :(得分:4)

我建议不要使用此#define。重新定义new不可移植,如果您以这种方式执行此操作,则会阻止随后使用展示位置new的任何内容。如果您在文件的手动#define生效之前强制执行此#include,那么您可能会面临库头文件与其源文件之间不兼容的风险,并且您在使用展示位置的库文件中会出现“意外”错误{ {1}}(经常是模板/容器类)。

如果您要重新定义new,请将其明确并留在源中。

答案 2 :(得分:2)

您可以将#define插入stdafx.h或common.h或任何其他包含在每个源文件中的头文件。

答案 3 :(得分:1)

  

编译器选项?

是的,您可以在项目属性中自定义define列表(据我记得,在“预处理器”或“高级”下)。这些define将出现在每个源文件中。

答案 4 :(得分:1)

您可以将#define放入h文件中,但不要将#ifndef后卫放在h文件中。然后#include每个源文件中的文件。

我不支持重新定义new,BTW。

答案 5 :(得分:0)

您可以在代码中的某处定义自己的全局new运算符,并有条件地进行编译。不要忘记包括所有4种新的变体(普通和阵列一种有和没有遗嘱)和两种变体的删除(普通和阵列一)。在我的Effective C ++,第三版(第8章)

的副本中,有一整章关于此事
#ifdef MYDEBUG
void* operator new(std::size_t size) { <your code here> }
void operator delete(void* p) { <your code here> }
#endif