Можно ли создавать макросы, чтобы заменить все формы 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()
.
Я знаю, что были написаны эссе о том, почему это невозможно, но я чувствую, что я настолько близок, что должно быть путь. Есть ли что-то очевидное, что мне не хватает?