我想在Visual C ++ 2005解决方案中的每个源文件中出现以下内容:
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
有没有办法在不手动复制的情况下执行此操作?编译器选项?
答案 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