如何检查2个定义是相同的

How to check 2 defines are the same?

本文关键字:定义 2个 何检查 检查      更新时间:2023-10-16

在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__)

如何检查新定义为DEBUG_new?

我试着用

#if defined(new) && new == DEBUG_NEW

它不起作用。

如果您有权访问有问题的MFC应用程序代码,我会将#ifdef结构更改为:

#ifdef _DEBUG
#define new DEBUG_NEW
#define NEW_REDEFINED
#endif

然后您可以使用#ifdef NEW_REDEFINED 进行检查

在宏中重新定义关键字的想法有点疯狂,我当然希望没有其他人遵循MFC的想法。在这种情况下,一个简单的

#ifdef new

就足够了。如果使用默认的new,则不会将关键字定义为宏。

根据你想要的具体内容,另一种选择可能是简单地使用

#ifdef _DEBUG

相信new是以您期望的形式定义的,当且仅当定义了_DEBUG时。

但是C++没有任何可以在#if表达式中执行的检查,该检查将告诉您宏是否以特定形式定义。

如果您只需要知道这两个定义在运行时是否相同,您可以使用以下内容:

#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