清楚的教程解释C中的模块化编程?

时间:2010-02-19 14:23:41

标签: c include modularity

我刚开始使用C语言进行模块化编程。我认为我对包含内容做错了,因为我遇到了很多conflicting types for 'functionName'previous declaration of 'functionName' was here错误。我确实把包含警卫放在了适当位置。

您是否知道一个清晰的教程,解释C中的模块化编程,尤其是夹杂物的工作原理?


更新:我试图孤立我的问题。根据要求,这是一些代码。

更新2 :更新后的代码如下。错误也已更新。

/*
 * main.c
 */
#include <stdio.h>
#include "aStruct.h"

int main() {
    aStruct asTest = createStruct();

    return 0;
}

/*
 * aStruct.h
 */
#ifndef ASTRUCT_H_
#define ASTRUCT_H_

struct aStruct {
    int value1;
    int value2;
    struct smallerStruct ssTest;
};
typedef struct aStruct aStruct;

aStruct createStruct();

#endif /* ASTRUCT_H_ */

/*
 * smallerStruct.h
 */
#ifndef SMALLERSTRUCT_H_
#define SMALLERSTRUCT_H_

struct smallerStruct {
    int value3;
};
typedef struct smallerStruct smallerStruct;

smallerStruct createSmallerStruct();

#endif /* SMALLERSTRUCT_H_ */

/*
 * aStruct.c
 */
#include <stdio.h>
#include "smallerStruct.h"
#include "aStruct.h"

aStruct createStruct() {
    aStruct asOutput;

    printf("This makes sure that this code depends on stdio.h, just to make sure I know where the inclusion directive should go (main.c or aStruct.c).\n");

    asOutput.value1 = 5;
    asOutput.value2 = 5;
    asOutput.ssTest = createSmallerStruct();

    return asOutput;
}

/*
 * smallerStruct.c
 */
#include <stdio.h>
#include "smallerStruct.h"

smallerStruct createSmallerStruct() {
    smallerStruct ssOutput;
    ssOutput.value3 = 41;
    return ssOutput;
}

这会生成以下错误消息:

  

在aStruct.h:10

     
      
  • 字段'ssTest'的类型不完整
  •   
     

在main.c:8

     
      
  • 未使用的变量`asTest'(这个有意义)
  •   

3 个答案:

答案 0 :(得分:3)

包含的基础是确保您的标题只包含一次。这通常使用如下序列执行:

/* header.h */
#ifndef header_h_
#define header_h_

/* Your code here ... */

#endif /* header_h_ */

第二点是通过处理带有前缀的手动伪命名空间来处理可能的名称冲突。

然后在你的头文件中只放入公共API的函数声明。这可能意味着添加typedef和枚举。尽可能避免包含常量和变量声明:首选访问器函数。

另一个规则是永远不要包含.c文件,只包括.h。这是模块化的重点:依赖于另一个模块的给定模块只需要知道它的接口,而不是它的实现。

对于您的具体问题,aStruct.h使用struct smallerStruct但对此一无所知,特别是它能够分配aStruct变量的大小。 aStruct.h需要包含smallerStruct.h。在smallerStruct.haStruct.h之前加main.c并不能解决编译aStruct.c时的问题。

答案 1 :(得分:2)

多重定义问题很可能来自您包含代码的方式。您正在使用#include“aStruct.c”而不是#include“aStruct.h”。我怀疑除了#include之外,你还在将.c文件编译到你的项目中。这会导致编译器由于同一函数的多个定义而变得混乱。

如果将#include更改为#include“aStruct.h”并确保将三个源文件编译并链接在一起,则错误应该消失。

答案 2 :(得分:0)

此类错误意味着函数声明(返回类型或参数计数/类型)与其他函数声明或函数定义不同。

previous declaration消息指出您有冲突的声明。