объявление структуры в файле .h и реализация в файле .c - PullRequest
4 голосов
/ 09 ноября 2010

это мой .h файл:

struct _MyString;  
typedef struct _MyString MyString;

Я хотел бы объявить своих членов в .c файле.

я пытался:

typedef struct MyString{
    char * _str;// pointer to the matrix
    unsigned long _strLength;
    }MyString;

но это не работает. Как мне объявить члены структуры в файле .c?

спасибо

Ответы [ 4 ]

11 голосов
/ 09 ноября 2010

Вам нужен только 1 typedef. Сохраните файл, который у вас уже есть, в файле .h и удалите все остальные.

Теперь имя структуры - struct _MyString. Это то, что вы должны определить в файле .c, а не struct MyString: обратите внимание на отсутствие символа _.

So

.h файл

struct _MyString;  
typedef struct _MyString MyString;

.c file

#include "file.h"
struct _MyString {
    char * _str;// pointer to the matrix
    unsigned long _strLength;
};
2 голосов
/ 09 ноября 2010

Что именно не работает?Если вы пытаетесь получить доступ к этой структуре из другого файла .c, это не сработает.Вся структура объявление должна быть видна всем исходным файлам, которые ее используют - обычно это делается путем объявления ее в заголовочном файле и #include - в исходных файлах.

Возможно, вы путаете это с тем, как функции объявлены в заголовочном файле и определены в исходном файле - объявление все еще должно быть видимым для всех исходных файлов.

0 голосов
/ 09 ноября 2010

пожалуйста, уточните, что не работает, чтобы получить правильное решение. Я думаю, что проблема в том, что вам нужно включить файл .h в файл .c, где вы определяете структуру. Также включайте .h в каждый файл .c, который нуждается в этом. Убедитесь, что в этом случае вы выходите за пределы этой структуры.

0 голосов
/ 09 ноября 2010

Если вам нужно использовать структуру в файле .c, то при компиляции требуется полное определение структуры. Это часто делается путем включения заголовочного файла с определением.

Если вам не нужно делиться определением структуры, вы можете поместить его в файл .c, но он будет виден только функциям в этом файле.

Кажется, вы пытаетесь создать интерфейс для своей структуры и определить его только в файле .c, чтобы другие части кода не могли получить доступ к структуре. Вы можете сделать это, но только через указатель. Так, например:

typedef struct MyString* MyString;

И в файле .c вы можете определить его. Вместо этого вы можете определять функции, используя определение типа MyString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...