重新定义自定义删除

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