当struct在另一个文件中声明时,如何使用struct作为函数的参数



我正在写一个c项目,我试图保持所有的结构声明在相关的。h文件。这允许我通过包含相关的头文件在任何。c文件中使用它们。我也避免在其他头文件中包含我的项目的头文件。我想这将使代码更容易阅读和维护。

我的问题是如何避免在使用该结构体的头文件中包含包含结构体声明的头文件。有什么办法可以做到吗?(我没有找到这个问题的答案,抱歉,如果它是重复的)。下面是一个代码片段:

cmd.c

#include "cmd.h"
#include "params.h"     //This allows usage of struct testPars
void move_parameters(struct testPars *testP) {
...
}

cmd.h

#ifndef CMD_H
#define CMD_H
#include "params.h"     //I want to avoid this include in this file
void move_parameters(struct testPars *testP) ;
#endif

params.h

#ifndef PARAMS_H
#define PARAMS_H
struct testPars {
    char    name[16];
    double  value;
};
#endif

总的来说,这里有很多关于正确的程序设计的困惑。

我试图保持所有的结构声明在相关的。h文件。这允许我通过包含相关的头文件在任何。c文件中使用它们。

对于快速&没有私有封装的脏编程,或者结构的性质很简单。

但是对于结构代表更复杂的adt等的专业程序,你应该只在头文件中保留一个前向声明,并在相应的c文件中定义结构。这导致了私有封装和模块化,即好的程序设计。(搜索"不透明类型"或"不透明指针"的示例。这种前向声明的正式术语是不完整类型)

你想做的听起来像上面的,但完全相反:向调用者公开定义,但不要自己使用它。显然,你不能使用一个你没有包含的结构体,也不能让它在你的程序中可见,因为这没有任何意义。

我也避免在其他头文件中包含我的项目的头文件。我想这将使代码更容易阅读和维护。

这是个坏主意。您的每个头文件都应被视为相应c文件的功能和使用方法的公共文档。虽然c文件可以被视为私有数据,但其内容与调用者无关。

该头文件文档的一个重要部分是列出该模块具有的所有依赖项,以便其他程序员可以快速浏览您的头文件顶部,并立即知道需要哪些文件来编译该特定模块。

好的程序设计力求尽可能少的依赖:"松耦合"。因此,所有的#includes都被认为是重要的信息,应该放在头文件的顶部。不应该包含不使用的头文件。

c文件不应该包含任何include,除了它自己的头文件。

最新更新