重新定义自定义删除
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) {
^
我试图制作一个自定义版本的删除,在使用时打印出来。这是在一个更大的项目中,所以我只用这两个文件创建了一个单独的项目并得到了同样的错误。
我尝试注释掉 custom_delete
函数中的所有代码。我还尝试在宏之前编写原型。我每次都得到同样的错误。
---编辑---
我发现还有另一个文件正在编译:
header.cpp
#include "header.h"
// Some commented out functions
如果我删除 #include "header.h"
一切正常。但是,我最终需要将函数添加到 header.cpp。这些函数需要添加到 header.h 的内容。我该怎么办?
您的 headers 中似乎没有 include guard。
将 #pragma once
添加为 header.h
的第一行
或为了更便携的解决方案,添加
#ifndef HEADER_H
#define HEADER_H
作为前两行,并且
#endif
作为 header.h
的最后一行。
此外,为避免 link 错误,请在函数声明中添加 inline
关键字,例如 inline void custom_delete(...
或将函数实现移动到 .cpp
。
我收到一条错误消息,提示我重新定义了一个函数 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) {
^
我试图制作一个自定义版本的删除,在使用时打印出来。这是在一个更大的项目中,所以我只用这两个文件创建了一个单独的项目并得到了同样的错误。
我尝试注释掉 custom_delete
函数中的所有代码。我还尝试在宏之前编写原型。我每次都得到同样的错误。
---编辑--- 我发现还有另一个文件正在编译: header.cpp
#include "header.h"
// Some commented out functions
如果我删除 #include "header.h"
一切正常。但是,我最终需要将函数添加到 header.cpp。这些函数需要添加到 header.h 的内容。我该怎么办?
您的 headers 中似乎没有 include guard。
将 #pragma once
添加为 header.h
或为了更便携的解决方案,添加
#ifndef HEADER_H
#define HEADER_H
作为前两行,并且
#endif
作为 header.h
的最后一行。
此外,为避免 link 错误,请在函数声明中添加 inline
关键字,例如 inline void custom_delete(...
或将函数实现移动到 .cpp
。