#define new[] new(__FILE__, __LINE__)为什么编译不过呢
时间: 2023-07-21 08:30:25 浏览: 60
`#define new[] new(__FILE__, __LINE__)` 这句宏定义确实会导致编译失败,因为 `new[]` 是一个 C++ 中的关键字,不能被定义为宏。如果你想要为数组 `new` 语句增加行号和文件名信息,可以定义另一个名字来代替 `new[]`,例如 `new_at`,然后使用 `#define new_at new(__FILE__, __LINE__)` 来定义该宏。
下面是示例代码:
```c++
#include <iostream>
#include <new>
void* operator new[](size_t size, const char* file, int line) {
void* p = ::operator new[](size);
std::cout << "File: " << file << ", Line: " << line << " -- ";
return p;
}
void operator delete[](void* p, const char* file, int line) noexcept {
::operator delete[](p);
std::cout << "File: " << file << ", Line: " << line << " -- ";
}
#define new_at new(__FILE__, __LINE__)
#define delete_at delete(__FILE__, __LINE__)
#define new_array_at new[](__FILE__, __LINE__)
#define delete_array_at delete[](__FILE__, __LINE__)
int main() {
int* p = new_at int;
delete_at p;
int* q = new_array_at int[10];
delete_array_at q;
return 0;
}
```
在这个示例代码中,我们定义了四个宏,分别是 `new_at`、`delete_at`、`new_array_at` 和 `delete_array_at`,它们分别代表带行号和文件名信息的 `new`、`delete`、`new[]` 和 `delete[]` 操作符。
需要注意的是,在使用 `new[]` 和 `delete[]` 时,我们需要使用 `new_array_at` 和 `delete_array_at` 代替原来的关键字。