在公共标头中重新定义 typedef

问题描述 投票:0回答:1

我正在尝试将

typedef
定义为私有头文件中的结构,并在公共头文件中重新定义它,因为它用作函数的参数,并且只应包含私有头以供使用,如
 中所示main.c
示例。我已经在一个更大的项目中看到了这一点,但似乎无法在测试项目中发挥作用。在主源文件中创建类型会导致错误
variable has incomplete type {typeName}

基本示例如下所示

fnc_private.h

#ifndef _FNC_PRIVATE_H_
#define _FNC_PRIVATE_H_

typedef struct fncStruct_t
{
    int a;
    int b;
} fncStruct_t;

#endif

fnc.h

#ifndef _FNC_H_
#define _FNC_H_

typedef struct fncStruct_t fncStruct_t;

int myFnc(fncStruct_t *h);

#endif

fnc.c

#include "fnc.h"
#include "fnc_private.h"

int myFnc(fncStruct_t *h)
{
    return h->a + h->b;
}

main.c

#include <stdio.h>

#include "fnc.h"

int main(void)
{
    fncStruct_t h = {3, 4}; // results in 'variable has incomplete type {fncStruct_t}'

    printf("sum = %d\n", myFnc(&h));

    return 0;
}

如果我在这里做了一些愚蠢的事情,我似乎看不到那是什么。预先感谢。

c typedef
1个回答
0
投票

main.c 看不到

fncStruct_t
的完整定义,只有声明,因此它无法创建该类型的变量。

您可以做的是创建一个指向该类型的指针,然后在 fnc.c 中使用一个函数来动态创建该对象并将其返回给您。

fnc.h

#ifndef _FNC_H_
#define _FNC_H_

typedef struct fncStruct_t fncStruct_t;

fncStruct_t *init(int a, int b);
int myFnc(fncStruct_t *h);

#endif

fnc.c

#include "fnc.h"
#include "fnc_private.h"

int myFnc(fncStruct_t *h)
{
    return h->a + h->b;
}

fncStruct_t *init(int a, int b)
{
    fncStruct_t *h = malloc(sizeof *h);
    h->a = a;
    h->b = b;
    return h;
}

main.c

#include <stdio.h>

#include "fnc.h"

int main(void)
{
    fncStruct_t *h = init(3, 4)

    printf("sum = %d\n", myFnc(h));
    free(h);

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.