自定义删除的重新定义
Redefinition of custom delete
我收到一个错误,说我重新定义了一个函数custom_delete。
header.h
#include <iostream>
#include <string>
static int unfreed_count = 0;
#define DELETE(O) custom_delete(O,__PRETTY_FUNCTION__, __LINE__)
void custom_delete(void* ptr, const std::string& function_name, unsigned int line_number) {
unfreed_count--;
std::cout << "delete called in " + function_name + ":" << line_number << std::endl;
std::cout << "unfreed_count: = " << unfreed_count << std::endl << std::endl;
free(ptr);
}
main.cpp
#include "header.h"
int main(int argc, char* argv[]) {
int* ptr = new int;
DELETE(ptr);
}
此代码在尝试编译时会导致以下错误消息:
main.cpp: In function 'void custom_delete(void*, const string&, unsigned int)':
main.cpp:5:6: error: redefinition of 'void custom_delete(void*, const string&, unsigned int)'
void custom_delete(void* ptr, const std::string& function_name, unsigned int line_number) {
^
In file included from main.cpp:21:0:
header.h:7:6: note: 'void custom_delete(void*, const string&, unsigned int)' previously defined here
void custom_delete(void* ptr, const std::string& function_name, unsigned int line_number) {
^
我试图制作一个自定义版本的delete,在使用时打印出来。这是在一个更大的项目中,所以我用这两个文件做了一个单独的项目,并得到了相同的错误。
我尝试注释掉custom_delete
函数中的所有代码。我还试着在宏之前编写原型。我每次都犯同样的错误。
---编辑---我发现还有另一个正在编译的文件:header.cpp
#include "header.h"
// Some commented out functions
如果我移除#include "header.h"
,一切正常。然而,我最终需要将函数添加到header.cpp中。这些函数需要添加到header.h中的东西。我该怎么办?
看起来您的头中没有include-guard。
添加#pragma once
作为header.h
的第一行
或者对于更便携的解决方案,请添加
#ifndef HEADER_H
#define HEADER_H
作为前两条线路,以及
#endif
作为CCD_ 5的最后一行。
此外,为了避免链接错误,请在函数声明中添加inline
关键字,如inline void custom_delete(...
或者将功能实现转移到CCD_ 8。
相关文章:
- 在类定义之后定义一个私有方法
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- 如何在C++中为 if 和 else 语句定义新行为
- 如何从 C++ 中的现有模板函数定义新函数
- 如何在CPropertySheet中定义新颜色
- 谁定义新操作员
- boost :: fibonacci_heap:带有比较器重新定义圆形定义错误的嵌套定义
- C 通过Typedef定义新类型
- 在 ss.clear() 之后使用 ss.str( " ") 用于新定义的字符串流
- 是标头文件中使用“新”定义的成员指针泄漏
- 使用带有Eigen库的自定义新处理程序
- 定义新的优化类型
- C# 如何定义新的指针结构
- 为模型定义新角色后程序崩溃
- C++使用类来定义新类型
- 操作员新[]定义分解
- 为什么不调用复制构造函数将临时对象复制到新定义的对象
- Qt:在按钮点击上添加自定义新选项卡
- 定义新的中缀操作符
- 错误:不能在返回类型中定义新类型