2015-03-20 2 views
1
struct I2C_CALLBACK_STRUCT 
    { 
     HANDLE (*I2C_OpenDevice)(UINT32 port, UINT32 freq); 
     BOOLEAN (*I2C_CloseDevice)(HANDLE handle); 
    }; 

    typedef struct I2C_CALLBACK_STRUCT I2C_CALLBACKS_T, *I2C_CALLBACKS_PTR; 

    static const I2C_CALLBACKS_T I2C_Callback = 
    { 
     OpenI2CPort, 
     CloseI2CPort, 
    }; 

Может ли кто-то пройти через приведенный выше код и объяснить, что происходит? Я понимаю, что заполнение структуры указателями функций, но я не понимаю, что происходит, когда вы используете typedef для создания новых типов I2C_CALLBACKS_T и *I2C_CALLBACKS_PTR. Также я не понимаю синтаксис, используемый при создании I2C_Callback ie. почему используется знак равенства, поскольку это не то, что я знаю ссинтаксическая путаница с созданием нового типа структуры

Я прошу прощения за бессвязную поездку, я не уверен в лучшем способе рассказать о моем запросе.

ответ

0

1) typedef

Что вы делаете с typedef создает два новых типа, I2C_CALLBACKS_T и I2C_CALLBACKS_PTR. Вы делаете это, так что вам не нужно писать struct ключевое слово перед определением структуры:

I2C_CALLBACKS_T a; // shorter 
struct I2C_CALLBACK_STRUCT a; //longer 

I2C_CALLBACKS_PTR Типа полезно, потому что вы не должны явным образом определить указатели на структуры:

I2C_CALLBACKS_PTR a, b, c; // shorter 
I2C_CALLBACKS_T *a, *b, *c; // longer 

2) инициализация структуры

Затем, указатели на функции I2C_Callback STRUCT просто получает отображается в OpenI2CPort и CloseI2CPort удовольствия ctions.

0

может быть, было бы понятнее, если вы удалите все «мусорные» символы, такие как:

// structure decalaration 
struct callback 
{ 
    FUNCPTR1 function1; 
    FUNCPTR2 function2; 
}; 

// getting rid of always typing `struct` and using a more convenient name 
typedef struct callback CALLBACK; 
typedef struct callback *CALLBACKPTR; // this one is bad behaviour if used, disturbing the reader of your code 

// defining a callback-variable with initialization 
CALLBACK c = {fun1, fun2}; 
// the same: 
struct callback c = {fun1, fun2}; 
// which is, more-or-less, equivalent to: (if it is used inside a scope of afunction): 
struct callback c; 
c.function1 = fun1; 
c.function2 = fun2; 

equal -знак следует рассматривать как assignment -знак.

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