重新定义自定义删除

问题描述:

我收到一个错误,说我已经重新定义了一个函数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中的东西。我该怎么办?

+0

如果将'#define DELETE(O)custom_delete(O,__ PRETTY_FUNCTION__,__LINE __)'移动到'custom_delete'之后会发生什么? – NathanOliver

+0

@NathanOliver我刚刚尝试过,结果相同。 :-( – Halbort

+1

除了其他所有与此有关的错误之外,试图释放()一些新的东西会导致不确定的行为,你不能'free'''什么'new'ed。 –

它看起来像你没有在你的头包括警卫。

添加#pragma once为您header.h

第一行或更多的便携式解决方案,加上

#ifndef HEADER_H 
#define HEADER_H 

的前两行,并

#endif 

header.h作为最后一行。

此外,为避免链接错误,添加inline关键字你的函数的声明,就像inline void custom_delete(...

或移动功能实施.cpp

+0

我已经拥有了标头警卫,但我忘记了包含它,但是,添加内联解决了这个问题。顺便说一句,为什么在这种情况下需要内联? – Halbort

+0

'inline'允许您复制函数的实现通过翻译单元(即'.cpp'),因为编译时编译器应该“知道”实现,以便编译器可以实际内联函数,这就是想法。否则不允许重新定义函数。 – igagis

+1

@Halbort - 所以你发布的代码不是导致问题的代码。叹。 –