【发布时间】:2010-10-11 19:01:30
【问题描述】:
是否可以创建宏来将所有形式的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()。
我知道essays have been written 知道为什么这是不可能的,但我觉得我已经很接近了,一定有办法。我有什么明显的遗漏吗?
【问题讨论】:
-
请注意,尚不清楚
#define new是否保证工作:open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#369 -
@JohannesSchaub-litb 但很明显,如果您在此之后还包含任何标准标头,则会调用 UB。
-
不要不要在任何头文件中尝试
#define任何关键字或标准函数、类型、对象、模板等的名称:包括标准头文件,在你做了这样的#define之后,有未定义的行为。
标签: c++ gcc c-preprocessor