首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个.c文件中包含不透明类型?

如何在多个.c文件中包含不透明类型?
EN

Stack Overflow用户
提问于 2019-04-16 12:43:31
回答 2查看 327关注 0票数 0

我应该根据一个头文件和一些进一步的描述来制作一个程序。需要处理不透明类型的问题。不透明结构是在头文件中声明的,还有其他一些函数。但是每个函数都应该有自己的.c文件,这就是问题所在。我应该做什么,或者应该在哪里定义不透明的结构,这样我的函数就可以使用它了?

我有这样的文件:

header.h .h source.c e.c(Main)功能1.c功能2.c等。

在这种情况下,我不知道该怎么做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-16 13:42:10

您的全局头文件应该在没有实现的情况下定义类型名称,以及创建、销毁和处理该类型数据的原型函数。

header.h

代码语言:javascript
复制
#ifndef HEADER_H_
#define HEADER_H_

struct XyzData;

typedef struct XyzData XYZDATA;
typedef struct XyzData *P_XYZDATA;

P_XYZDATA CreateEmptyXyzData();
P_XYZDATA CreateFilledXyzData(int param1, int param2);
void DestroyXyzData(P_XYZDATA pData);
int ModifyXyzData(P_XYZDATA pData, int action, int param);

#endif

然后您需要一个内部标头,它为结构提供了一个实现。

xyzintheader.h

代码语言:javascript
复制
#ifndef XYZINTHEADER_H_
#define XYZINTHEADER_H_

#include "header.h"    // include the XyzData declaration

struct XyzData {       // and add its definition
    int   par1;
    int   par2;
};

#endif

然后,具有特定例程实现的文件将使用内部标头,因为它们需要知道访问它们的结构细节。

xyzcreate.c

代码语言:javascript
复制
#include "xyzintheader.h"
#include <stdlib.h>

P_XYZDATA CreateEmptyXyzData() {
    return calloc(1, sizeof(XYZDATA));
};

xyzcreatf.c

代码语言:javascript
复制
#include "xyzintheader.h"
#include <stdlib.h>

P_XYZDATA CreateFilledXyzData(int param1, int param2) {
    if (P_XYZDATA pData = malloc(sizeof(XYZDATA))) {
        pData->par1 = param1;
        pData->par2 = param2;
        return pData;
    }
    return NULL;
};

xyzdestr.c

代码语言:javascript
复制
#include "xyzintheader.h"
#include <stdlib.h>

void DestroyXyzData(P_XYZDATA pData) {
    free(pData);
}

xyzmodif.c

代码语言:javascript
复制
#include "xyzintheader.h"

int ModifyXyzData(P_XYZDATA pData, int action, int param) {
    if (! pData)
        return -1;
    switch (action) {
    case 0:
        // do something
        pData->par1 = pData->par2 = 0;
        return 0;

    case 1:
        // do something
        pData->par1 += param;
        pData->par2 -= param;
        return 0;
    }

    return -2;
}

外部模块将使用公共标头,因为它们只需要知道存在的结构以及处理它的工具。

source.c

代码语言:javascript
复制
#include "header.h"

void SomeExternalLogic()
{
    if (P_XYZDATA pData = CreateEmptyXyzData()) {
        ModifyXyzData(pData, 0, 0);
        ModifyXyzData(pData, 1, 3);
        if (ModifyXyzData(pData, 13, 17) < 0)
            WriteSomeErrorMessage();

        DestroyXyzData(pData);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-04-16 12:53:08

我将创建一个私有(内部)头文件,与包含结构定义的公共header.h文件分开。

为了保持一致性,它可能应该包括公共标题。类似于:

代码语言:javascript
复制
#ifndef INTERNAL_HEADER_H_
#define INTERNAL_HEADER_H_

#include "header.h"  // contains 'struct foo;'

struct foo {
    int data;  // or whatever
};

#endif

然后,您的每个.c文件都可以包含internal_header.h并访问结构成员。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55708456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档