2013-07-07 3 views
2

Я знаю, что typedef'ing позволяет ссылаться на структуру без использования ключевого слова struct. Тем не менее, с этим:Что означает этот C-код?

typedef struct SYSTEM SYSTEM; 

Я видел этот ЬурейеЕ в C API, но struct SYSTEM имеет не были определены ранее.

Фактически, файл .c, содержащий только эту строку, будет скомпилирован сам по себе.

Что думает компилятор SYSTEM (or struct SYSTEM) на самом деле есть?

Большое спасибо!

+1

возможно дубликат [Что такое эффект typedef'ing на структуру себе?] (Http://stackoverflow.com/questions/17515787/what-is-the-effect-of-typedefing-a -струкция к себе) –

+0

*** Вы задали этот вопрос 18 минут назад. *** Он был закрыт. Почему вы серьезно его перепродаете? –

+3

@ H2CO3: это потому, что он обновил вопрос позже, и никто не ответил на этот вопрос ... обновленный вопрос не является дубликатом, и он не должен был быть закрыт. и потому что нет ответа там, этот не должен быть закрыт как дубликат. О, хорошо, это сложно. –

ответ

5

Структуру не нужно определять. Это должно быть только объявлено. Представленная вами декларация typedef включает объявление struct SYSTEM.

Так что это эквивалентно:

struct SYSTEM; 

typedef struct SYSTEM SYSTEM; 

Благодаря этому ЬурейеЕ, SYSTEM Теперь имена неполный тип, так что вы можете использовать его как SYSTEM * в определениях интерфейса, без необходимости подвергать фактическое определение структуры, которые могут быть конфиденциальными:

public_header.h:

typedef struct SYSTEM SYSTEM; 

SYSTEM * create_system(); 

int do_useful_thing_with(SYSTEM * system, int count, void * addr); 

void destroy_system(SYSTEM * system); 

private_impl.c:

#include <public_header.h> 

struct SYSTEM { int a; char b[12]; float q; void * next; }; 

SYSTEM * create_system() 
{ 
    SYSTEM * p = malloc(sizeof *p); 
    if (p) { p->a = 2; p->q = 1.5; } 
    return p; 
} 

void destroy_system(SYSTEM * system) 
{ 
    free(system); 
} 

// etc. 
+0

Спасибо! Таким образом, предположительно, программисты API определили это где-то на стороне API интерфейса? – James

+0

@James: Это не пусто. Это не определено. Пустая структура - это определенная структура типа 'struct Foo {};'. Я добавил объяснение; вы можете использовать его как неполный тип. –

+0

Примите это, когда я смогу :) – James

-1

Я бы сказал, что это, как правило, опрометчивое поведение, но суть в том:

typedeftypename

..where здесь типа является struct SYSTEM и имя присвоено SYSTEM.

Обычно для typedef обычно вводится другое имя, чем тип typedef. Следовательно, низкое мнение многих поддерживающих код может иметь такое поведение.

+0

Хорошо, если вы используете его правильно, это плохо, если вы злоупотребляете им. Хорошее использование обычно - именно то, о чем спрашивал OP (избавление от ненужного беспорядка 'struct'), плохое использование - это именно то, о чем вы говорите (предоставление произвольных имен уже названным материалам). – cmaster

+1

Вызов 'struct'" clutter "является грубым непониманием системы типов в C и/или чистой леностью. –

+0

* Обычно для typedef обычно вводится другое имя, чем тип typedef. * Um, no. 'typedef struct NAME NAME' - чрезвычайно распространенная идиома в старом C-коде. Это синтаксический сахар DIY, чтобы не набирать «struct» снова и снова. Ничего плохого в этом нет. – dodgethesteamroller

0

Это типичная конструкция C, а не C++ и Java и т. Д., Которые непосредственно определяют типы в глобальном пространстве имен. C-структуры не могут быть доступны только по их имени, поэтому typedef необходимо для вызова SYSTEM только SYSTEM.

struct SYSTEM { 
    ... 
}; 
struct SYSTEM foo; //legal 
SYSTEM bar; //illegal 
typedef struct SYSTEM SYSTEM; //give it a global name 
SYSTEM baz; //now it's legal