Estou confuso sobre o significado de void *function()
.
É um ponteiro para a função ou uma função retornando void*
? Eu sempre o usei em estruturas de dados como uma função recursiva retornando um ponteiro, mas quando vi um código em multithreading ( pthread
), há uma mesma declaração de função. Agora estou confuso qual é a diferença entre eles.
c++
c
pointers
function-pointers
declaration
user9515151
fonte
fonte
void*function();
é sintaticamente correto. Por exemplo, para Python, eles escolheram uma decisão diferente - o formato faz parte da sintaxe. IMHO, os dois lados têm seus prós e contras.void *function()
é uma função que pega um número arbitrário de argumentos e retorna um valor que, quando desreferenciado, é do tipo nulo . Em C ++,void* function()
é uma função que não aceita argumentos e retorna um valor de ponteiro para vazio . Você deve decidir qual idioma está perguntando.void *
. Afinal, mesmo se você pudesse, o que você faria com umvoid
?Respostas:
A função tem o tipo de retorno
void *
.Por isso, sempre prefiro separar o símbolo
*
do nome da função, comoE, como
Jarod42
indicado em um comentário, você pode reescrever a declaração da função em C ++ usando o tipo de retorno à direita, comoSe você deseja declarar um ponteiro para funcionar, escreva
Ou
Ou um ponteiro para função que retorna o ponteiro para função
fonte
void* function();
. Isso não é tão tentador ... ;-) (A edição aconteceu apenas enquanto escrevia este.)void * reader();
então empthread_create(&thread1,null,reader,reader_arg)
vez depthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
é para ... ;-)Sempre que não tenho certeza sobre problemas de sintaxe C, gosto de usar o utilitário cdecl ( versão online ) para interpretar para mim. Ele traduz entre sintaxe C e inglês.
Por exemplo, insiro seu exemplo
void *foo()
e ele retornouPara ver como seria a outra sintaxe, insiro
declare foo as pointer to function returning void
e ela retornouIsso se torna particularmente útil quando você tem vários níveis de previsões de tipos, estrelas ou colchetes em uma única expressão.
fonte
É uma função que retorna um ponteiro para
void
.Pense na sua declaração desta maneira:
Esta seria uma função retornando
void
(ou nada):Pense na declaração acima desta maneira:
Uma maneira muito mais fácil de escrever isso é usar
typedef
s:Isso geralmente elimina a confusão em torno dos ponteiros de função e é muito mais fácil de ler.
fonte
As declarações em C / C ++ são lidas do identificador para fora após a precedência do operador .
Uma rápida olhada na tabela de precedência do operador C / C ++ na wikipedia revela que o operador de chamada de função
()
tem uma precedência mais alta que o operador indireto*
. Portanto, suas declarações de função são assim:Comece pelo identificador:
function
isfunction()
uma função que não aceita argumentosvoid* function()
e retorna avoid*
.Esse princípio geral também se aplica às declarações de array (
[]
também tem precedência maior que*
) e combinações dos dois. assimé lido como
arr
éarr[42]
uma matriz de 42 elementos que são*arr[42]
ponteiros para(*arr[42])()
funções que não levam argumentos eint *(*arr[42])()
retornar umint*
.Demora um pouco para se acostumar com isso, mas depois de entender o princípio, é fácil ler essas declarações sem ambiguidade.
fonte