10
votes

Pouvez-vous expliquer la déclaration C / C ++ suivante?

void (*func)(int(*[ ])());

6 Réponses :


5
votes

Oui:

$ cdecl
explain void (* x)(int (*[])());
declare x as pointer to function 
  (array of pointer to function returning int) returning void


3 commentaires

Je ne pense pas que ce soit, CDECL n'aime tout simplement pas le nom Func .


Nahhhh ... c'est un bug dans CDECL :)


Il vous montre trompé, Lulz (BTW c'est une bonne triche, CDECL est belle XD)



20
votes

Ce n'est pas une déclaration, c'est une déclaration.

Il déclare FUNC en tant que pointeur sur une fonction renvoyant le vide et en prenant un seul argument de type int (* []) ​​( ) , lequel est lui-même un pointeur sur un pointeur sur une fonction renvoyant int et de prendre un nombre d'arguments fixe mais non spécifié.


Sortie CDECL pour ye petite foi: xxx


4 commentaires

"Nombre fixe mais non spécifié d'arguments" - la question est également étiquetée C ++, auquel cas le deuxième type de fonction prend précisément zéro argument.


La balise C ++ a été ajoutée par une personne autre que l'affiche originale, après avoir répondu. Un mouvement trop intelligent, par mon livre.


Gosh, c'est sournois. Il n'est jamais clair quand quelqu'un dit "C / C ++" s'ils l'ont dit parce qu'ils pensent que la réponse est la même pour les deux langues, car ils pensent que les réponses sont différentes entre les deux ...


+1, je veux juste expliquer pourquoi vous dites "Pointeur au pointeur" et CDECL dit "Array of Pointer": Ceci est parce que dans les fonctions, les paramètres déclarés sous forme de tableaux devenus. Donc, personne ne dit "hé, tu as une faute de frappe" :)



2
votes

void (* func) (bla); est un pointeur à une fonction prise bla comme argument, où bla est < Code> int (* []) ​​() est une matrice de points de fonction.


0 commentaires

2
votes

Voici un guide sur la lecture C Déclarations:

http://www.ericgiguere.com/articles/reading-c -declarations.html


0 commentaires

31
votes

La procédure générale pour la lecture des déclarateurs poilues est de trouver l'identifiant le plus à gauche et de passer votre moyen de sortir, en vous rappelant que [] code> et () code> bind avant * / Code> (c.-à-d., * a [] code> est un tableau de pointeur, pas un pointeur sur un tableau). Ce cas est un peu plus difficile par le manque d'identifiant dans la liste des paramètres, mais encore une fois, [] code> se lie avant * code>, donc nous savons que * [] code> indique un tableau de cuiteurs.

Donc, donné p> xxx pré>

Nous le cassons comme suit: P>

/**
 * Define the functions that will be part of the function array
 */
int foo() { int i; ...; return i; }
int bar() { int j; ...; return j; }
int baz() { int k; ...; return k; }
/**
 * Define a function that takes the array of pointers to functions
 */
void blurga(int (*fa[])())
{
  int i;
  int x;
  for (i = 0; fa[i] != NULL; i++)
  {
    x = fa[i](); /* or x = (*fa[i])(); */
    ...
  }
}    
...
/**
 * Declare and initialize an array of pointers to functions returning int
 */
int (*funcArray[])() = {foo, bar, baz, NULL};
/**
 * Declare our function pointer
 */
void (*func)(int(*[ ])());
/**
 * Assign the function pointer
 */
func = blurga;
/**
 * Call the function "blurga" through the function pointer "func"
 */
func(funcArray); /* or (*func)(funcArray); */


1 commentaires

+1 Pour suffisamment bon, essayez d'expliquer comment lire de telles expressions et exemple.



2
votes

Geordi code> est un bot C ++, Permet de former ceci:

<litb> geordi: make func a (function returning void and taking (int(*)()) []) *
<geordi> {} void (* func)(int(*[])());


0 commentaires