重复的结构定义(标头中的一个定义和C源中的另一个定义)

时间:2010-06-22 14:55:48

标签: c

  1. 在头文件abc.h
  2. 中声明了一个结构STRUCT_ABC
  3. abc.h文件中包含abc.c,并在abc.c内的某个函数中使用了STRUCT_ABC。
  4. 另一个文件def.c不包含abc.h。但是在def.c中,我再次定义了一个具有相同名称的结构,即STRUCT_ABC,但内容不同。
  5. abc.c& def.c在同一个库下,控件在运行时首先出现在abc.c中。
  6. 控件从abc.c转到def.c,然后多次回来。
  7. 这是否总能给出运行时错误,或者有时可能会有效?

3 个答案:

答案 0 :(得分:0)

它肯定不会导致运行时错误。

编译器将在编译使用该结构的文件时获取它所看到的结构的定义,因此您不应该得到任何编译或链接器错误。

但是,真的,如果你想在2个地方使用相同的结构,你最好在一个标题中定义它,并#include在多个.c文件中。它将使维护更容易(您只需要更新一次结构)并且您将确定您正在使用哪个定义(因为只有一个)。

答案 1 :(得分:0)

如果我的记忆是正确的,这取决于结构的定义应用了多少装饰,但它通常会起作用(尽管我们需要更多的细节才能确定)。只要两个代码单元不知道另一个单元中的冲突声明,编译器就不会为每个结构使用相同的名称,并且最终它会在任何情况下编译为未命名的内存块。不要将结构从abc传递给def并期望它工作(如果你尝试的话,它可能会在编译时出错),但只要它们没有踩到对方的脚趾就应该没问题。

答案 2 :(得分:0)

与其他海报一样,如果你在两个地方严格定义结构,你应该没问题。但是,你要求麻烦,特别是如果def.c需要包含abc.h。

根据您的描述,我不清楚STRUCT_ABC是结构名称还是实例名称。如果要在两个文件中定义结构的实例(在函数外部),并且实例的名称相同,那么除非您声明一个或两个实例static,否则会出现编译问题。

错误应该是编译错误,除非你欺骗函数期望一个STRUCT_ABC使用另一个(即通过指针)。