2014-10-27 3 views
1

Я пытаюсь скомпилировать этот код в c. Прежде всего я должен это структура в отдельном исходном файле, чтобы использовать его как «класс» (dir.h)Передача указателя struct как параметр

//Structure 
typedef struct s_dirobject { 
    int noteid; 
    char title[20]; 
    int bytes; 
    char head[20]; 
    bool is_dir; 
    struct s_dirobject* next; 
} dirobject; 

//Ops 
void add_dirobject(dirobject* myDirobject,int num_dirobject, char title[20], int is_dir,  int bytes, char head[20]); 
int get_dirobject_noteid(dirobject* myDirobject,int num_note); 
char* get_dirobject_title(dirobject* myDirobject,int num_note); 
int get_dirobject_bytes(dirobject* myDirobject,int num_note); 
char* get_dirobject_head(dirobject* myDirobject,int num_note); 
bool isdir(dirobject* myDirobject, int num_note); 
int get_dirobjects_len(dirobject* myDirobject); 
void clear_dir(dirobject* myDirobject); 
void init_dir(dirobject* myDirobject); 

На втором месте у меня есть источник порта связи для извлечения содержимого каталога с удаленного файловой системы и заполнить объект (comms.c)

#include "notebook.h" 
#include "dir.h" 

dirobject* temporaldirobjects; 

... 

init_dir(temporaldirobjects); 
while(cond) { 
    //Add retrieved item to the directory 
    add_dirobject(temporaldirobjects, index, title, is_dir, bytes, ""); 
} 
//When done retrieving the contents from the source i do instantiate the notebook_window 
notebook_init(source, path, temporaldirobjects); 

Наконец, мой интерфейс окна ноутбука будет выглядеть следующим образом. (Notebook.h)

#include "dir.h" 
void notebook_init(char* source, char* path, dirobject* contents); 
void notebook_deinit(); 

И его реализация (notebook.c)

void notebook_init(char* source, char* path, dirobject* contents) { 

    // Fill the vars 
    this_window_source=source; 
    this_window_path=path; 
    this_window_dirobjects=contents; 

    ... 
} 

Когда я скомпилировать этот код, как есть, я получаю ошибку о том, что

../src/dir.h:13:16: error: redefinition of 'struct s_dirobject' 
In file included from ../src/notebook.h:12:0, 
       from ../src/comms.c:25: 
../src/dir.h:13:16: note: originally defined here 
In file included from ../src/comms.c:27:0: 
../src/dir.h:20:3: error: conflicting types for 'dirobject' 
In file included from ../src/notebook.h:12:0, 
       from ../src/comms.c:25: 
../src/dir.h:20:3: note: previous declaration of 'dirobject' was here 
In file included from ../src/comms.c:27:0: 
../src/dir.h:23:6: error: conflicting types for 'add_dirobject' 
In file included from ../src/notebook.h:12:0, 
       from ../src/comms.c:25: 
../src/dir.h:23:6: note: previous declaration of 'add_dirobject' was here 
... 

так В библиотеку comm входят dir.h и notebook.h, а notebook.h тоже. и если я удалить включить в notebook.h я получил эту другую ошибку:

In file included from ../src/comms.c:25:0: 
../src/notebook.h:14:46: error: unknown type name 'dirobject' 

Как я достигнуть этого? Я хотел бы сохранить его как чистый код, как я могу.

ответ

2

Вы включены два заголовка в файле comms.c

#include "notebook.h" 
#include "dir.h" 

заголовка notebook.h в свою очередь, включает в себя заголовочные dir.h

#include "dir.h" 
void notebook_init(char* source, char* path, dirobject* contents); 
void notebook_deinit(); 

В результате структура определяется дважды в одной и той же единице компиляции. Вы должны указать, что каждый заголовок будет включен только один раз в каждый блок компиляции. Для этого вам нужно поставить кластеры заголовка. Например,

#ifndef DIR_H 
#define DIR_H 

//Structure 
typedef struct s_dirobject { 
    int noteid; 
    char title[20]; 
    int bytes; 
    char head[20]; 
    bool is_dir; 
    struct s_dirobject* next; 
} dirobject; 

//... 

#endif 

Или, если компилятор поддерживает #pragme один раз, вы можете его использовать.

1

Обычно несколько деклараций хороши в с, но многократный определение нет. В вашем коде вы включаете dir.h несколько раз, что вызывает переопределение struct s_dirobject. Читайте что-нибудь о «Header guard» или «Include Guard». here. Надеюсь, что это решает ваши основные проблемы с переопределениями.

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