Для текущего проекта я не могу использовать C ++ (к сожалению), только чистый C, и у меня возникает следующая проблема:
У меня есть 3 отличительные структуры, которые должны вызывать одно и то же имя функции, и я чувствую, что это более элегантно, чем ниже, вместо того, чтобы создавать 3 разные функции для разных типов, как мне кажется, легче поддерживать их. Как я могу получить указатель, который вызывает функцию? По сути, то, что я пытаюсь воспроизвести, в основном похоже на "this" в C ++ или self (в Obj-C), есть ли в любом случае, я могу сделать это в простом C?
[test.h]
enum
{
TYPE_A = 0,
TYPE_B = 1,
TYPE_C = 2
};
typedef struct
{
char type;
void ( *GetType )( void );
// Some other data different than the other struct
}A;
typedef struct
{
char type;
void ( *GetType )( void );
/* Some other data different than the other struct */
}B;
typedef struct
{
char type;
void ( *GetType )( void );
// Some other data different than the other struct
} C;
A *create_a( void );
B *create_b( void );
C *create_c( void );
void GetType( void );
[test.c]
A *create_a( void )
{
A *a = ( A * ) calloc( 1, sizeof( A ) );
a->type = TYPE_A;
a->GetType = GetType;
return a;
}
B *create_b( void )
{
B *b = ( B * ) calloc( 1, sizeof( B ) );
b->type = TYPE_B;
b->GetType = GetType;
return b;
}
C *create_c( void )
{
C *c = ( C * ) calloc( 1, sizeof( C ) );
c->type = TYPE_C;
c->GetType = GetType;
return c;
}
void GetType( void )
{
printf("How to get the pointer that call this function to retrieve the type?");
}
[main.c]
int main (int argc, const char * argv[])
{
A *a = create_a();
B *b = create_b();
C *c = create_c();
a->GetType();
b->GetType();
c->GetType();
return 0;
}