2016-01-16 3 views
-1

У меня есть функция, которая принимает параметр void * как параметр, но я хочу использовать его, как если бы это была структура.Передача struct как параметра вместо void *

typedef struct struct1 
{ 
    int val; 
} struct2; 

void func1(void* struct3) 
{ 
    printf("%d",struct3->val); 
} 

Моя цель состоит в том, например, если у меня есть файл .h, где функция определяется как

typedef void* parameter1; 
void func1(parameter1 p1); 

И хочет использовать-структуру в качестве параметра этой функции, не объявляя struct в файле .h.

+2

Пожалуйста, не используйте указатели void. Обычно он заканчивается в слезах –

+3

, вы не можете использовать '->' на указателе void, вам нужен указатель структуры или, как минимум, листинг. –

+0

Тогда как передать структуру как параметр, как я упоминал выше, не определяя его в файле .h? –

ответ

1

Спасибо за ответ printf("%d",((struct2 *)struct3)->val), упомянутый @ i486, вот что я искал.

+0

Предшествующий пользовательский прозвище с _address of_ operator (_ & _) не работает так же, как символ '@'. Например, _ @ i486_. :) – ryyker

+0

Возможно, для этого вы были _looking_, но это, безусловно, не то, что вам нужно **. Это решение для XY-проблемы и рецепта для desaster.Почему вы не используете только правильный тип аргумента? – Olaf

0

В заголовке объявить тип структуры неполным. Например:

typedef struct struct1 struct1; 
extern void func1(struct1 *p1); 

Или:

struct struct1; 
void func1(struct struct1 *p1); 

Вы можете mix'n'match extern или нет, и typedef против struct tag.

В коде реализации (или заголовок реализации, если у вас есть несколько исходных файлов, реализующих поддержку типа), включить общественный заголовок и определить тип структуры:

struct struct1 
{ 
    …private details… 
}; 

В C11 и за его пределами, вам может повторять typedef, если он относится к тому же типу; в более ранних версиях C вы не могли этого сделать.

Преимущество такого подхода заключается в том, что клиентский код вынужден использовать ваши функции, поскольку они не знают внутренних элементов структуры, но они получают меру безопасности типа. В частности, указатель на случайную структуру не может быть передан этой функции. Если все принимает void *, то вы можете передать неправильный тип структуры функции, потому что все указатели void выглядят одинаково. Это и недоброжелательно, и не нужно.