我在 C 中遇到了一个经典的多重继承问题。
我创建了源文件Stack.c和Queue.c。它们都#include 一个文件 Node.c(其中包含分配和释放内存的函数)。现在,我正在尝试在单个文件中实现另一个程序,为此我需要同时包含 Stack.c 和 Queue.c。我试图 #include 两个文件,但编译器抛出了一个冲突类型错误。
这样做的最正确方法是什么?
提前致谢!!
我在 C 中遇到了一个经典的多重继承问题。
我创建了源文件Stack.c和Queue.c。它们都#include 一个文件 Node.c(其中包含分配和释放内存的函数)。现在,我正在尝试在单个文件中实现另一个程序,为此我需要同时包含 Stack.c 和 Queue.c。我试图 #include 两个文件,但编译器抛出了一个冲突类型错误。
这样做的最正确方法是什么?
提前致谢!!
调用这种“多重继承”可能会让人感到困惑,因为多重继承是 C 中不会出现的面向对象的编程问题。
在我看来,您的困难可能是您尝试#include 可执行代码(即.c
文件)而不是链接.c
文件和#include 标头(.h
)文件,这些文件为文件中的函数提供声明.c
。
如果您#include
源文件 (.c)... 您应该(在大多数情况下)#include
标题 (.h),则会发生这种情况。标头通常提供函数原型、typedef、宏等,但忽略了实际的实现。
函数的实际实现、变量的定义等应该在每个编译单元中发生一次,并且通常在一个.c
文件中。
如果您有其他代码需要重用在另一个编译单元(例如Stack.c)中定义的函数或变量,您将#include Stack.h
提供您可能需要的函数原型、全局变量名称等。
编译完所有编译单元后,链接器的工作就是确定在哪个目标文件或库中定义了函数或变量。当你#include "X.c"
在另一个编译单元中时,它的工作会变得非常复杂,因为这样你就会得到多个位置对于同一件事(符号,因为链接器喜欢这样称呼它们)。
简而言之,使用标头并让链接器完成其工作。
在相关的说明中,这与多重继承无关。对于像 C++ 这样的语言来说,这是一个面向对象的问题。您所描述的正确名称是“符号冲突”或“重复符号”。
没有看到你的程序的细节,很难说。但是,冲突类型错误通常可以通过重新排列代码或添加函数原型来解决。
您会看到,在从上到下读取源文件时,需要在调用函数之前对其进行描述。例如:
char foo1 ()
{
char blah = foo2();
return blah;
}
char foo2 ()
{
return 'a';
}
你会得到一个冲突的类型错误,因为当它在里面时foo1
,它还没有看到声明foo2
。因此,它假定无论foo2
是什么,它都会返回一个int
. 但实际上它返回一个char
. 这两个不一样,所以……报了一个冲突的类型错误。
您可以通过foo2
在源代码中排在第一位或插入函数原型来解决此问题:
char foo2 (); // function prototype
char foo1 ()
{
char blah = foo2();
return blah;
}
char foo2 ()
{
return 'a';
}
出于同样的原因,如果包含源文件,也可能会出现冲突类型错误。#include "Node.c"
本质上是复制粘贴。从包含切换Node.c
到包含Node.h
外部化函数将是一个好主意。如果您在计划包含的源文件中为函数名称添加前缀,例如....、、、等,您也可以避免nodeInsert
很多问题nodeDelete
。nodeCompare