main.c
个文件,另有operations.c
和operations.h
个文件。
显然operations.c
包括operations.h
,
main.c
也包括operations.h
。
但后来我发现需要从main.c
引用operations.c
中实现的功能。但当我将#include "main.c"
放入operations.c
时,我收到了多个定义的错误。
你如何处理这种情况?
我在一些代码中遇到过,一个人正在使用某种方法。他有"global.h"
个文件,其中包含operations.h
和main.h
(我必须手动创建main.h
)。然后从main.c
和operations.c
开始,您只需添加global.h
。我认为这种方式多重定义错误消失了。您怎么看?这是处理我上面提到的问题的方法之一吗?
答案 0 :(得分:3)
这是一种方式,是的。
另一个当然是从main()
中移除main.c
以外的函数,并将它们放在一个单独的模块中,具有自己的实现(.c
)和标题({{1文件。
对于多重包含使用保护通常也是一个好主意,即在每个标题的顶部,执行以下操作:
.h
然后在底部,在所有声明等之后,有:
#if !defined FOO_H_
#define FOO_H_
当然,#endif /* FOO_H_ */
应该是实际的文件名,即FOO_H_
文件中的OPERATIONS_H_
,依此类推。
答案 1 :(得分:0)
为标题中的函数声明原型并包含它。它们应该定义一次(在main.c
中),但是您可以在声明的许多地方引用它们。
答案 2 :(得分:0)
但后来我遇到了需要从operations.c中引用main.c中实现的函数的情况。
如果您有这样的需求,那么您的程序设计就会出现根本性的缺陷。您应该将其更改为面向对象的模型,其中每个模块(h文件+ c文件)都是自治的,除了自己的特定目的之外,不知道或关心任何其他模块。特别是,项目中的单个文件不应具有导致main.c的依赖性。
他有“global.h”文件,其中包括operations.h和main.h
这会导致整个程序中出现一些非常糟糕的错误,称为 tight coupling ,其中每个代码模块都依赖于另一个模块。您应该使用面向对象的设计编写C模块,使其尽可能自主,同时尽可能使用 private encapsulation 。