2015-10-06 2 views
4

Я пытаюсь понять анонимные союзы для использования. Вариант использования должен иметь возможность использовать разные прототипы данного метода в таблице указателей функций. Например, в следующем фрагменте кода myfunc может иметь два варианта: один, который принимает только строку; и тот, который может принимать дополнительные параметры.Анонимный союз в C

Вот мой код snippet-

typedef struct my_struct 
{ 
    union{ 
      int (*myfunc)(char*); 
      int (*myfuncEx)(char*, int); 
    }; 

}my_struct_t; 

int myfunc_imp(char* x) 
{ 
    printf("This is myfunc_imp - %s\n", x); 
} 

int myfuncEx_imp(char* x, int y) 
{ 
    printf("This is myfuncEx_imp - %s\n", x); 
    printf("This is myfuncEx_imp - %d\n", y); 
} 

int main() 
{ 
    char *string = "Hello World"; 
    my_struct_t me1, me2; 
    me1.myfunc = myfunc_imp; 
    me1.myfunc(string); 

    me2.myfuncEx = myfuncEx_imp; 
    me2.myfuncEx(string, 7); 

    static const me3 = {myfuncEx_imp}; 
    me3.myfuncEx(string, 8); 

    return 0; 
} 

Пример МЕ1 и те2, кажется, обеспечивают правильные результаты. Но пример me3. Где я пытаюсь статически инициализировать объединения в структуре, бросает это error-

warning: initialization makes integer from pointer without a cast 
error: request for member `myfuncEx' in something not a structure or union 

Может кто-то указать правильный путь инициализации анонимного объединения в структуре.

Edit: я объявляя-структуру неправильно в очень четко неправильно, правильно ПУТЬ

static const my_struct_t me3 = {myfuncEx_imp}; 
+6

Попробуйте 'static const my_struct_t me3 = {myfuncEx_imp};'. – owacoder

+1

wow спасибо, это было чисто немым с моей стороны. Спасибо чувак. –

+0

Есть ** no ** анонимные 'union' или' struct's. Но есть _анонимные структуры или члены союза. То есть «анонимное» свойство принадлежит к окружающему 'struct' /' union', а не к анонимному 'struct'' union'. Итак, ** в теории ** ** может ** быть также анонимным членом 'int'. (просто мысленный эксперимент, стандарт этого не позволяет, потому что вы не могли бы ссылаться на него,) – Olaf

ответ

1

Я побежал в этом вчера. Вы не можете инициализировать объединение без указания члена объединения. В противном случае это неоднозначно. Итак,

static const my_struct_t me3 = { .myfuncEx = myfuncEx_imp }; 
Смежные вопросы