是否可以创建宏来替换所有形式的operator new
重载,包括额外的 args...say__FILE__
和__LINE__
?
问题似乎是operator new
可以使用或不使用括号进行编码,因此:
类对象宏:
#define new new(__FILE__, __LINE__)
将替换如下声明:
A* a = new A();
和类似函数的宏:
#define new(A) new (A, __FILE__, __LINE__)
将替换如下声明:
A* a = new(std::nothrow) A();
不幸的是,尝试用相同的标识符声明两个宏是错误的,即使它们是不同的类型,所以以下失败:
#define new new(__FILE__, __LINE__)
#define new(A) new (A, __FILE__, __LINE__) // Error: "new" already defined
由于我使用的是 g++,我希望使用他们的可变参数宏语法会取得成功,但不幸的是没有。以下:
#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
只匹配new(xyx) A()
,不匹配new A()
。
我知道有文章写过为什么这是不可能的,但我觉得我已经很接近了,一定有办法。有什么明显的我失踪了吗?