进行一些开发,我遇到了一个非常奇怪的问题。我需要在头文件中声明指针,我想在cpp文件中分配它。请看这个片段:
ptr.h
#ifndef PTR_H
#define PTR_H
int* ptr;
#endif // PTR_H
ptr.cpp
#include "ptr.h"
void init() {
ptr = new int;
}
void destroy() {
delete ptr;
}
的main.cpp
#include "ptr.h"
int main() {
}
(是的,我知道,代码在内存安全方面非常差,但这不是重点)
使用命令编译:
g++ ptr.cpp main.cpp
给我带来以下错误:
/tmp/ccBvaGqX.o:(.bss+0x0): multiple definition of `ptr'
/tmp/ccmJWQcS.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
你碰巧知道,为什么会这样?我的意思是,即使我有适当的包含警卫,但事实证明编译器看到int *p
的多个定义。
我还应该指出,在我的实际代码中,这个指针不是原始指针,而是我在那里使用命名空间。但它在编译错误方面没有任何改变。
编辑:
请记住我的问题。我知道,宣布extern int* ptr
会解决问题,但我的问题却不同。为什么,因为我有适当的包含保护,编译器看到ptr
的多个定义?