【发布时间】:2019-05-08 16:57:39
【问题描述】:
这是我的示例代码https://godbolt.org/z/VKgKik
#define delete MyCustomDelete(__FILE__, __LINE__), delete
#define CAT(X,Y) CAT2(X,Y)
#define CAT2(X,Y) X##Y
#define CAT_3(X,Y,Z) CAT(X,CAT(Y,Z))
class A {
A() = CAT_3(de,le,te);
};
godbolt 示例设置为显示预处理器输出。目标是在预处理程序结束时,我希望输出代码是
class A {
A() = delete;
};
目前“ThisShouldNotshowUp”会显示在此处。我认为使用 ## 运算符会阻止预处理器重新扩展,但它没有。
我意识到删除“#define delete”可以解决问题,但我需要这个定义。我创建一个与 delete 同名的宏的原因是因为我希望能够跟踪新闻和删除,如果发生内存泄漏,我可以看到哪一行代码分配了它。因此,这个宏意味着我可以继续在我的代码中使用关键字 delete,并且可以免费填写文件和行号。据我所知,除了定义一个删除宏之外,没有其他方法可以实现此功能。这是问题的症结所在。删除宏为我提供了强大的调试工具,但它删除了一个有用的语言功能供我使用。
【问题讨论】:
-
1.
CAT_2和_helper从未使用过。 2.#define delete使程序格式错误;不允许将关键字定义为宏名称。 -
我知道这在技术上是违反标准的,但是我可以做些什么来让它工作吗?让我们假设删除#define delete 是不可能的
-
在我看来像XY problem。为什么需要这个?
-
已更新,希望能解决您的问题
-
@RemyLebeau 我认为原因是一旦进入
operator delete,您将无法再访问delete表达式所在的源文件和行。
标签: c++ c++11 preprocessor preprocessor-directive