используя структуру C, которая объявлена ​​позже - PullRequest
2 голосов
/ 06 февраля 2012

Я хочу использовать структуру typedef, которая еще не определена, но это позже.Есть что-то похожее на прототип структуры?

файл container.h

// i would place a sort of struct prototype here
typedef struct 
{
 TheType * the_type;
} Container;

файл thetype.h

typedef struct {......} TheType;

файл main.c

#include "container.h"
#include "thetype.h"
...

Ответы [ 4 ]

4 голосов
/ 06 февраля 2012

В container.h:

struct _TheType;
typedef struct _TheType TheType;

Чем в thetype.h:

struct _TheType { ..... };
3 голосов
/ 06 февраля 2012

Замените эту строку:

// i would place a sort of struct prototype here

этими строками:

struct TheType;
typedef struct TheType TheType;

Поскольку вам необходимо определить тип TheType до того, как тип Container определен, у вас естьиспользовать прямое объявление типа TheType - и для этого вам также необходимо предварительное объявление структуры TheType.

Тогда вы не будете определять typedef TheType следующим образом:

typedef struct {......} TheType;

но вы определите структуру TheType:

struct {......};
1 голос
/ 06 февраля 2012

Вы еще не можете определить объект неопределенной struct; но вы можете определить указатель на такой struct

struct one {
    struct undefined *ok;
    // struct undefined obj; /* error */
};

int foo(void) {
  volatile struct one obj;
  obj.ok = 0;               /* NULL, but <stddef.h> not included, so 0 */
  if (obj.ok) return 1;
  return 0;
}

Указанный выше модуль допустим (и компилируется с gcc без предупреждений).

1 голос
/ 06 февраля 2012

Вы можете объявить структуру внутри typedef:

typedef struct TheType_Struct TheType;  // declares "struct TheType_Struct"
                                        // and makes typedef
typedef struct
{
    TheType * p;
} UsefulType;

Обратите внимание, что вы можете иметь только не более одного typedef в одной единице перевода в C89 и C99 (этоотличается от C11 и C ++).

Позже вы должны определить фактическое struct TheType_Struct { /* ... */ }.

...