在MFC应用程序中,有一个用于诊断内存泄漏等的定义。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
在afx.h中,存在DEBUG_NEW定义
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#define DEBUG_NEW new(THIS_FILE, __LINE__)
如何检查new被定义为DEBUG_NEW?
我尝试使用
#if defined(new) && new == DEBUG_NEW
它不起作用。
答案 0 :(得分:3)
如果您有权访问相关的MFC应用程序代码,我会将#ifdef
构造更改为:
#ifdef _DEBUG
#define new DEBUG_NEW
#define NEW_REDEFINED
#endif
然后,您可以使用#ifdef NEW_REDEFINED
答案 1 :(得分:1)
在宏中重新定义关键字的想法有点疯狂,我当然希望没有其他人遵循这个MFC的想法。在那种情况下,一个简单的
#ifdef new
就足够了。如果使用默认new
,则不会将关键字定义为宏。
根据您具体的具体情况,另一种选择可能只是使用
#ifdef _DEBUG
相信new
是以您期望的形式定义的,当且仅当_DEBUG
被定义时。
但是C ++没有任何可以在#if
表达式中执行的检查,它将告诉您宏是否以特定形式定义。
答案 2 :(得分:0)
如果您只需要知道这两个定义在运行时是否相同,您可以使用以下内容:
#include "string.h"
#define STR(s) #s
#define compare(a, b) (strcmp(STR(a), STR(b)) == 0)
这会比较用于定义每个宏的确切字符串,因此它可能仅在某些情况下有用,请考虑:
#define MY_INT1 int
#define MY_INT2 int
#define MY_INT3 (int)
#define MY_FLOAT float
compare(MY_INT1, MY_INT2) // Evaluates to true
compare(MY_INT1, MY_INT3) // Evaluates to false
compare(MY_INT1, MY_FLOAT) // Evaluates to false