Typedef C Struct:无效使用不完整的typedef

时间:2016-03-29 01:25:40

标签: c gcc struct typedef

我在尝试输入构造结构时遇到以下错误。我之前已经完成了这项工作,并遵循与以前完全相同的格式,但有些东西不起作用,我完全被难倒了。

Shm_channel.h:

typedef struct _msgQ_info msgQ_info;
/*
 * This function initializes and returns a mesQ_info struct for
 * the user 
 */
 msgQ_info init_message_queue();

Shm_channel.c:

// Struct that contains all the message queue information
struct _msgQ_info {
    mqd_t descriptor;
    mode_t mode;
    char *name;
};

Other_file.c:

#include <errno.h>
#include <getopt.h>
#include <signal.h>
#include <strings.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <mqueue.h>

#include "shm_channel.h"

//... Inside of Main()
    msgQ_info msgQinfo;
      msgQinfo = init_message_queue();
      if(0 > open_message_queue(&msgQinfo)){
        fprintf(stderr, "message queue descriptor failed to be initialized in webproxy.c\n");
        return 0;
      }else{
        fprintf(stderr, "Message queue descriptor successfully created with value : %d\n", msgQinfo.descriptor);
      }

错误:

enter image description here

3 个答案:

答案 0 :(得分:2)

msgQ_info是否属于不透明类型?如果是,则不应在Shm_channel.c之外篡改它。

考虑这样一个设计的原因......你认为作者是否有可能试图阻止不可移植的内部构件泄漏到抽象之外并进入可移植代码?

如果您决定篡改它,您可能应该在Shm_channel.c的范围内这样做,其中结构(非可移植?)内部是隔离的。

答案 1 :(得分:-1)

在Other_file.c中替换&#34; shm_channel.h&#34;使用&#34; shm_channel.c&#34;

shm_channel.c 的开头有:

#include "shm_channel.h"

任何.h文件都应包含在.c文件中,且名称相同(不合格)。

答案 2 :(得分:-1)

添加

#include "shm_channel.c"

#include "shm_channel.h"
<_>在Other_file.c中

您的编译器将msgQ_info视为&#34;不完整的typedef&#34;,因为您没有告诉它struct _msgQ_info是什么。由于struct _msgQ_info已经存在shm_channel.c的声明,您只需要#include

或者,将声明添加到shm_channel.h

// Struct that contains all the message queue information
struct _msgQ_info {
    mqd_t descriptor;
    mode_t mode;
    char *name;
};

typedef struct _msgQ_info msgQ_info;
/*
 * This function initializes and returns a mesQ_info struct for
 * the user 
 */
msgQ_info init_message_queue();

我个人更喜欢第二种方法,因为它可以使您的项目更加清晰。