0

我在 C 中遇到了一个经典的多重继承问题。

我创建了源文件Stack.cQueue.c。它们都#include 一个文件 Node.c(其中包含分配和释放内存的函数)。现在,我正在尝试在单个文件中实现另一个程序,为此我需要同时包含 Stack.c 和 Queue.c。我试图 #include 两个文件,但编译器抛出了一个冲突类型错误。

这样做的最正确方法是什么?

提前致谢!!

4

3 回答 3

7

调用这种“多重继承”可能会让人感到困惑,因为多重继承是 C 中不会出现的面向对象的编程问题。

在我看来,您的困难可能是您尝试#include 可执行代码(即.c文件)而不是链接.c文件和#include 标头(.h)文件,这些文件为文件中的函数提供声明.c

于 2013-09-01T06:02:00.183 回答
1

如果您#include源文件 (.c)... 您应该(在大多数情况下)#include标题 (.h),则会发生这种情况。标头通常提供函数原型、typedef、宏等,但忽略了实际的实现。

函数的实际实现、变量的定义等应该在每个编译单元中发生一次,并且通常在一个.c文件中。

如果您有其他代码需要重用在另一个编译单元(例如Stack.c)中定义的函数或变量,您将#include Stack.h提供您可能需要的函数原型、全局变量名称等。

编译完所有编译单元后,链接器的工作就是确定在哪个目标文件或库中定义了函数或变量。当你#include "X.c"在另一个编译单元中时,它的工作会变得非常复杂,因为这样你就会得到多个位置对于同一件事(符号,因为链接器喜欢这样称呼它们)。

简而言之,使用标头并让链接器完成其工作。


在相关的说明中,这与多重继承无关。对于像 C++ 这样的语言来说,这是一个面向对象的问题。您所描述的正确名称是“符号冲突”或“重复符号”。

于 2013-09-01T06:13:12.817 回答
0

没有看到你的程序的细节,很难说。但是,冲突类型错误通常可以通过重新排列代码或添加函数原型来解决。

您会看到,在从上到下读取源文件时,需要在调用函数之前对其进行描述。例如:

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很多问题nodeDeletenodeCompare

于 2013-09-01T07:03:57.253 回答