自定义删除的重新定义

Redefinition of custom delete

本文关键字:定义 新定义 删除 自定义      更新时间:2023-10-16

我收到一个错误,说我重新定义了一个函数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。