Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;类重新定义错误-帮助我理解标题和链接 我开始用C++编写一个简单的解释器,它将用下面的类结构来描述,但是我退出了java并重写了这个东西,因为标题让我很难。这是C++中显然不允许的基本结构:_C++_Header_Linker_Redefinition - Fatal编程技术网

C++;类重新定义错误-帮助我理解标题和链接 我开始用C++编写一个简单的解释器,它将用下面的类结构来描述,但是我退出了java并重写了这个东西,因为标题让我很难。这是C++中显然不允许的基本结构:

C++;类重新定义错误-帮助我理解标题和链接 我开始用C++编写一个简单的解释器,它将用下面的类结构来描述,但是我退出了java并重写了这个东西,因为标题让我很难。这是C++中显然不允许的基本结构:,c++,header,linker,redefinition,C++,Header,Linker,Redefinition,main.cpp包含main函数,并包含一个类的头,我们可以调用printer.h(其单空方法在printer.cpp中实现)。现在想象另外两个相同的类。他们都想调用Printer::write_something(),所以我在每个文件中都包含了printer.h。因此,这里是我的第一个问题:为什么我可以#包含一百万次,即使是一次又一次,但我只能包含一次标题?(好吧,我想我可以对我的代码做同样的事情,只要它在同一个文件中。但是我可能错了。)我理解声明和实现/定义之间的区别,但是代码给了我一个类重

main.cpp包含main函数,并包含一个类的头,我们可以调用printer.h(其单空方法在printer.cpp中实现)。现在想象另外两个相同的类。他们都想调用
Printer::write_something(),所以我在每个文件中都包含了printer.h。因此,这里是我的第一个问题:为什么我可以
#包含
一百万次,即使是一次又一次,但我只能包含一次标题?(好吧,我想我可以对我的代码做同样的事情,只要它在同一个文件中。但是我可能错了。)我理解声明和实现/定义之间的区别,但是代码给了我一个类重新定义错误。我不明白为什么。这里有一件事让我大吃一惊(可能会告诉你为什么我一点都不懂):我不能只在main.cpp的顶部包含printer.h,然后使用我另外两个类中的类。我知道我可以将printer.h包含在两个类(标题)中的一个中,没有任何问题,但我不明白为什么这与在将类包含在main.cpp中之前包含它有什么不同(因为这样做会导致类未找到错误)

当我受够了,我想转移到C,因为我使用的OOP是非常强制的,但我会遇到同样的问题,除非我把所有的东西都写在一个文件中。了解C++是令人沮丧的,但是由于编译问题,它不能正确使用。 如果你能帮我澄清一下,我将不胜感激。谢谢

为什么我可以包含一百万次,甚至一次又一次,但我只能包含一次标题

这可能是因为你的标题没有正确的标题


请注意,最佳做法是为include-guard定义选择更长的名称,以最大限度地减少两个不同头可能具有相同名称的可能性。

大多数头文件应包装在include-guard中:

#ifndef MY_UNIQUE_INCLUDE_NAME_H
#define MY_UNIQUE_INCLUDE_NAME_H

// All content here.

#endif

这样,编译器在每个翻译单元中只会看到一次标题内容。

C/C++编译被划分为编译/翻译单元以生成目标文件。(.o、.obj)

C/C++文件中的#include指令直接等效于同一文件中的简单递归复制粘贴。你可以试着做个实验

因此,如果同一个翻译单元包含两次相同的头,编译器会看到某些实体被多次定义,就像在同一个文件中写入它们一样。错误输出将完全相同


该语言中没有内置的保护来阻止您执行多个包含,因此您必须为每个C/C++头编写包含保护或特定的#pragma样板文件。

您熟悉包含/头保护吗(请参阅)。iostream库应该有它们,而您的打印机.h标头很可能没有。页眉保护试图确保只使用一个页眉定义。我最初尝试过,但没有成功。可能是因为我只在两个标题中的一个标题中使用了它们。另外,在重读你的问题后作为一个注释。这不是C++独有的,如果打印机.h声明了函数,打印机将定义C的实现(您仍然需要头保护),那么您将在C中遇到同样的问题。有关C中的类似问题,请参见:include-guard命名约定如何工作?我是否在ifndef中包含我的普通头?@AVR您将在ifndef中包含典型头定义。至于命名约定问题,请参见:我是否仍然必须包含我的正常标题?当我第一次遇到这个问题时,我用这个作为解决方案,但它不起作用,可能是因为我认为命名会自动连接到实际的标题。(我以为PRINTER_H和PRINTER.H是一样的)@AVR应该是你的标题。换句话说,修改你的所有标题,使它们都有include-guard,当然有唯一的名称。啊哈,应该注意你的//评论。还有一个问题:这是否告诉编译器/链接器不要重新定义类?我想我的问题是编译器不知道如何再次将头链接到实现。
#ifndef MY_UNIQUE_INCLUDE_NAME_H
#define MY_UNIQUE_INCLUDE_NAME_H

// All content here.

#endif