如何检查2定义是否相同?

时间:2016-05-07 09:58:43

标签: c++

在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

它不起作用。

3 个答案:

答案 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