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