Ponteiro de function Typedef?

Eu estou aprendendo como carregar dinamicamente DLL’s, mas o que eu não entendo é esta linha

typedef void (*FunctionFunc)(); 

Eu tenho algumas perguntas. Se alguém puder respondê-las, eu ficaria grato.

  1. Por que o typedef é usado?
  2. A syntax parece estranha; depois de void deve haver um nome de function ou algo assim? Parece uma function anônima.
  3. Um ponteiro de function é criado para armazenar o endereço de memory de uma function?

Então estou confuso no momento; você pode esclarecer as coisas para mim?

typedef é uma construção de linguagem que associa um nome a um tipo.
Você o usa da mesma maneira que usaria o tipo original, por exemplo

  typedef int myinteger; typedef char *mystring; typedef void (*myfunc)(); 

usando-os como

  myinteger i; // is equivalent to int i; mystring s; // is the same as char *s; myfunc f; // compile equally as void (*f)(); 

Como você pode ver, você pode simplesmente replace o nome do typedefed pela sua definição dada acima.

A dificuldade está no ponteiro para syntax e legibilidade de funções em C e C ++, e o typedef pode melhorar a legibilidade de tais declarações. No entanto, a syntax é apropriada, uma vez que as funções – ao contrário de outros tipos mais simples – podem ter um valor de retorno e parâmetros, portanto, a declaração, às vezes longa e complexa, de um ponteiro para function.

A legibilidade pode começar a ser realmente complicada com indicadores para arrays de funções e alguns outros sabores ainda mais indiretos.

Para responder suas três perguntas

  • Por que o typedef é usado? Para facilitar a leitura do código – especialmente para pointers para funções ou nomes de estrutura.

  • A syntax parece estranha (no ponteiro para declaração de function) Essa syntax não é óbvia para ler, pelo menos quando começando. Usando uma declaração typedef vez facilita a leitura

  • Um ponteiro de function é criado para armazenar o endereço de memory de uma function? Sim, um ponteiro de function armazena o endereço de uma function. Isto não tem nada a ver com o construtor typedef que apenas facilita a escrita / leitura de um programa; o compilador apenas expande a definição typedef antes de compilar o código real.

Exemplo:

 typedef int (*t_somefunc)(int,int); int product(int u, int v) { return u*v; } t_somefunc afunc = &product; ... int x2 = (*afunc)(123, 456); // call product() to calculate 123*456 
  1. typedef é usado para tipos de alias; neste caso, você está aliasing FunctionFunc para void(*)() .

  2. Na verdade, a syntax parece estranha, dê uma olhada nisso:

     typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments 
  3. Não, isso simplesmente diz ao compilador que o tipo FunctionFunc será um ponteiro de function, ele não define um, assim:

     FunctionFunc x; void doSomething() { printf("Hello there\n"); } x = &doSomething; x(); //prints "Hello there" 

Sem a palavra typedef , em C ++, a declaração declararia uma variável FunctionFunc do tipo ponteiro para function de sem argumentos, retornando void .

Com o typedef , em vez disso, define FunctionFunc como um nome para esse tipo.

Se você pode usar o C ++ 11, você pode querer usar a std::function e using palavra-chave.

 using FunctionFunc = std::function; 
 #include  #include  /* To define a new type name with typedef, follow these steps: 1. Write the statement as if a variable of the desired type were being declared. 2. Where the name of the declared variable would normally appear, substitute the new type name. 3. In front of everything, place the keyword typedef. */ // typedef a primitive data type typedef double distance; // typedef struct typedef struct{ int x; int y; } point; //typedef an array typedef point points[100]; points ps = {0}; // ps is an array of 100 point // typedef a function typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point) // prototype a function distance findDistance(point, point); int main(int argc, char const *argv[]) { // delcare a function pointer distanceFun_p func_p; // initialize the function pointer with a function address func_p = findDistance; // initialize two point variables point p1 = {0,0} , p2 = {1,1}; // call the function through the pointer distance d = func_p(p1,p2); printf("the distance is %f\n", d ); return 0; } distance findDistance(point p1, point p2) { distance xdiff = p1.x - p2.x; distance ydiff = p1.y - p2.y; return sqrt( (xdiff * xdiff) + (ydiff * ydiff) ); }