Можно ли создать макросы для замены всех форм operator new
перегрузками, которые включают дополнительные аргументы ... скажем, __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 ++, я надеялся, что использование их синтаксиса variadic macros даст успех, но, к сожалению, нет. Следующее:
#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
соответствует только new(xyx) A()
, а не new A()
.
Я знаю, что были написаны эссе о том, почему это невозможно, но я чувствую, что я настолько близок, что должен быть способ. Есть ли что-то очевидное, чего мне не хватает?