31 votes

Fonctions à l'intérieur de fonctions en C

Je suis en train de créer un code similaire à celui-ci :

#include <stdio.h>

double some_function( double x, double y)
{
  double inner_function(double x)
  { 
    // some code
    return x*x;
  }

  double z;
  z = inner_function(x);
  return z+y;

}

int main(void)
{
  printf("%f\n", some_function(2.0, 4.0));
  return 0;
}

Cela se compile parfaitement dans GCC (sans aucun avertissement) mais ne se compile pas dans ICC.

La CCI donne :

main.c(16): error: expected a ";"
    { 
    ^

main.c(21): warning #12: parsing restarts here after previous syntax error
    double z;
            ^

main.c(22): error: identifier "z" is undefined
    z = inner_function(x);
    ^

compilation aborted for main.c (code 2)

Qu'est-ce que je fais de travers ?

Merci.

(edit) Désolé pour le mauvais exemple. Dans mon code original, j'ai un peu besoin de faire ce genre de choses. J'utilise un intégrateur numérique GSL et j'ai quelque chose comme :

double stuff(double a, double b)
{
  struct parameters
  {
    double a, b;
  };

  double f(double x, void * params)
  {
    struct parameters p = (struct parameters *) params;
    double a = p->a, b = b->b;
    return some_expression_involving(a,b,x);
  }
  struct parameters par = {a,b};

  integrate(&f, &par);

}

Et j'ai beaucoup de fonctions avec ce type de structure : elles sont le résultat d'une intégration d'une fonction avec beaucoup de paramètres externes. Et les fonctions qui implémentent l'intégration numérique doivent recevoir un pointeur vers une fonction de type :

double f(double x, void * par)

J'aimerais vraiment que les fonctions soient imbriquées de cette manière afin que mon code ne soit pas alourdi par de nombreuses fonctions. Et j'espère pouvoir le compiler avec ICC pour accélérer un peu les choses.

1voto

Naveen Points 37095

Il ne s'agit pas d'un code C valide, les fonctions internes n'étant pas prises en charge en C.

1voto

aJ. Points 17014

Les définitions de fonctions locales à l'intérieur d'une fonction sont illégales en C.

1voto

Shawn Chin Points 29756

Les fonctions imbriquées ne font pas partie des normes C. Il n'y a donc aucune garantie qu'elles fonctionneront pour tous les compilateurs et elles doivent être évitées.

1voto

Nick Presta Points 13298

Au cas où vous vous demanderiez comment désactiver les extensions GCC et autres.

Vous pouvez utiliser le -ansi qui définit essentiellement la norme c89 et désactive les fonctionnalités de GCC qui sont incompatibles avec la norme ISO C90.

Voir le documents pour plus d'informations. Consultez le site -std également.

0voto

pjbeardsley Points 643

Je ne suis pas un expert, mais je suis prêt à parier que c'est soit explicitement interdit, soit non défini par la spécification C99, et qu'il est donc préférable de s'en abstenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X