typecast для (void *) при передаче указателя на объект - PullRequest
0 голосов
/ 16 января 2019

Рассмотрим следующий фрагмент:

void my_func(int a, void *b);
...

struct my_struct s = { };
my_func(10, (void *)&s);

Нужно ли указывать (void *) при передаче функции &s?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

вам не нужно делать это с некоторыми исключениями, так как вы можете получить предупреждение, если объект, ссылку на который вы передаете функции, является volatile или const - обычно имеет другой атрибут.

void ee(void *q)
{
    pritntf("%p", q);
}

volatile int g;
const int f;

int main()
{

    ee(&g);
    ee(&f);
}

выдает это предупреждение:

<source>: In function 'main':

<source>:17:8: warning: passing argument 1 of 'ee' discards 'volatile' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&g);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'volatile int *'

 void ee(void *q)

         ~~~~~~^

<source>:18:8: warning: passing argument 1 of 'ee' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&f);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'const int *'

 void ee(void *q)

         ~~~~~~^

Compiler returned: 0
0 голосов
/ 16 января 2019

Указатель на любой тип может быть свободно преобразован в void * или без него.

Раздел 6.3.2.3p1 C стандарта гласит:

Указатель на void может быть преобразован в или из указателя на любой объект тип. Указатель на любой тип объекта может быть преобразован в указатель на void и обратно; результат должен сравниться равным к исходному указателю.

Единственное время, когда требуется приведение, - это если вы передаете указатель на переменную функцию, такую ​​как printf, где неявное преобразование не может произойти, поскольку оно не будет знать, какой именно тип передается.

Обратите внимание, что, как и для любого типа указателя, вы не можете "удалить" квалификатор, такой как const, при передаче в функцию без приведения. Разделы 6.3.2.3p2 гласят:

Для любого квалификатора q указатель на не квалифицированный тип q может быть преобразован в указатель на q квалифицированную версию тип; значения, сохраненные в исходном и преобразованном указателях, должны сравниваться равными.

0 голосов
/ 16 января 2019

Нет, это не требуется, оно просто делает код более понятным в отношении того, что именно передается в функцию.

...