C Struct: typedef Сомневаюсь! - PullRequest
       8

C Struct: typedef Сомневаюсь!

0 голосов
/ 15 января 2011

В данном фрагменте кода я ожидал ошибку symbol Record not found. Но он скомпилирован и прекрасно работает на компиляторе Visual Studio 2010. Я запускал его как программу на C из командной строки Visual Studio 2010 в следующем порядке -

cl Record.c
Запись

Теперь сомнение, разве typedef не проверяет символы? Это работает больше как forward declaration?

#include "stdio.h"
#include "conio.h"

typedef struct Record R;
struct Record
{
    int a;
};

int main()
{   
    R obj = {10};
    getch();
    return 0;
}

Ответы [ 3 ]

1 голос
/ 15 января 2011

Вы всегда можете ссылаться на неопределенные структуры, что, в конце концов, является типичным способом реализации связанных списков.Они просто должны быть определены, когда вы хотите использовать их поля. Эта страница содержит некоторые детали.

0 голосов
/ 15 января 2011

typedef необходимо использовать после определения первого параметра.

struct Record
{
    int a;
};
typedef struct Record R;

или

typedef struct Record
{
    int a;
} R;

Если вам нужно использовать struct Record в структуре, просто используйте struct Record:

typedef struct Record
{
    struct Record *next;
}
typedef struct Record R;
0 голосов
/ 15 января 2011

C не находит символ Record, потому что он объявлен позже в коде, как если бы вы пытались использовать функцию, которую вы объявили в коде, без определения его прототипа.

Вы также можете объединить два объявления, и тогда оно станет:

typedef struct Record
{
    int a;
} R;

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

...