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

时间:2016-10-07 11:15:56

标签: c 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

1 个答案:

答案 0 :(得分:0)

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

  

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

这是快速和可接受的做法。脏编程,你没有私有封装,或者结构是简单的。

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

您尝试做的事情听起来像上面但完全倒退:将定义暴露给来电者,但不要自己使用它。很明显,你不能使用你没有包含的结构并使你的程序可见,因为这没有任何意义。

  

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

这是一个坏主意。您的每个头文件都将被视为相应c文件的功能以及应如何使用的公共文档。虽然c文件可以被视为私有数据,但内容并不是调用者应该关注的内容。

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

良好的程序设计力求尽可能少的依赖关系:"松散耦合"。因此,所有#includes都被视为应放在头文件之上的重要信息。不应包含未使用的头文件。

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