2016-03-29 5 views
-1

Я получаю следующие ошибки при попытке typedef структуры. Я сделал это раньше и следую тому же самому формату, что и раньше, но что-то не работает, и я полностью в тупике.Typedef C 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

+1

Не размещайте изображения текста! – Olaf

+0

Как компилятор для 'Other_file.c' должен знать, насколько велика структура? И какой макет он имеет? – Olaf

+0

Вы не можете объявлять переменные типа структуры без указания полной структуры определения.В противном случае компилятор понятия не имеет, сколько памяти выделяется для него. Поэтому переместите определение структуры из этого '.c' файла и в файл' .h'. –

ответ

-1

Добавить

#include "shm_channel.c" 

перед тем

#include "shm_channel.h" 

в Other_file.c

Ваш компилятор считается msgQ_info как "неполной ЬурейеЕ", потому что вы не сказали ему, что 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(); 

Я лично предпочитаю второй подход, поскольку это делает ваш проект более ясным.

-1

В Other_file.c заменить "shm_channel.h" с "shm_channel.c"

И в начале shm_channel.c есть:

#include "shm_channel.h" 

Любой .h файл должен быть включен в .c файл с тем же (неквалифицированным) именем.

2

Действительно ли msgQ_info должен быть непрозрачным? Если это так, вы не должны подделывать его снаружи Shm_channel.c.

Рассмотрите причины такого дизайна ... Считаете ли вы возможным, что автор пытался предотвратить проникновение непереносимых внутренних компонентов мимо абстракции и в то, что должно быть переносным кодом?

Если вы решили вмешаться в это, вы должны, вероятно, сделать это в пределах Shm_channel.c, где внутренние структуры (не переносные?) Изолированы.

Смежные вопросы