GNT sans publicité, site mobile, fonctionnalitées exclusives...

Fonctions imbriquées en C

Le
Alain BARTHE
Bonsoir,

Une petite question sur les fonctions en C : depuis quand peut-on en C
imbriquer la définition d'une fonction à l'intérieur d'une autre ?

Je fais du C depuis plusieurs années et je suis tombé récemment sur un
truc du genre :

#include <stdio.h>

void main()
{
int i;

int f (int x)
{
return x * 3;
}

for (i = 0; i < 100; i++) printf ("%d = %d", i, f(i));
}

Ca peut-être assez pratique, pour ne pas polluer le code avec des
fonctions qui ne servent que dans une fonction donnée.

Je faisais des trucs du style en Pascal il y a bien longtemps, et je
savais que c'était autorisé en C++, mais je n'aurais jamais eu la
curiosité de le tester en C.

Pour info, ce code a été testé sous Linux avec gcc 4.1.2
Lire les 33 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 7
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #22426401
In article Alain BARTHE
Bonsoir,

Une petite question sur les fonctions en C : depuis quand peut-on en C
imbriquer la définition d'une fonction à l'intérieur d'une autre ?



C'est une extension specifique a gcc.

Ca pose d'eventuels problemes. C'est implemente avec une technique appelee
"trampolines", qui necessite dans pas mal de cas de rendre la pile executable,
ce qui la rend nettement plus sensible aux attaques de type buffer-overflow...
JKB
Le #22427091
Le Sat, 31 Jul 2010 23:05:56 +0000 (UTC),
Marc Espie
In article Alain BARTHE
Bonsoir,

Une petite question sur les fonctions en C : depuis quand peut-on en C
imbriquer la définition d'une fonction à l'intérieur d'une autre ?



C'est une extension specifique a gcc.

Ca pose d'eventuels problemes. C'est implemente avec une technique appelee
"trampolines", qui necessite dans pas mal de cas de rendre la pile executable,
ce qui la rend nettement plus sensible aux attaques de type buffer-overflow...



Que ce soit une extension, peut-être, je ne me suis jamais penché
sur ce problème. En revanche, je ne connais pas de compilo qui
refuse les fonctions imbriquées. gcc 2.7 l'autorisait déjà, DEC C
aussi, le compilo Sun n'est pas gêné... Aurais-tu des exemples ? Je
pose la question parce que pour une histoire de lisibilité,
j'utilise ça dans quelques programmes et je n'ai jamais eu un
utilisateur qui soit venu râler parce que la bibliothèque en
question refusait de compiler...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Éric Lévénez
Le #22427201
Le 01/08/10 10:22, JKB a écrit :
En revanche, je ne connais pas de compilo qui
refuse les fonctions imbriquées.



Je pense que Clang n'a pas cette extension.

--
Éric Lévénez
FAQ de fclc :
JKB
Le #22427191
Le Sun, 01 Aug 2010 10:37:25 +0200,
Éric Lévénez
Le 01/08/10 10:22, JKB a écrit :
En revanche, je ne connais pas de compilo qui
refuse les fonctions imbriquées.



Je pense que Clang n'a pas cette extension.



Clang, c'est le truc utilisé par MacOS ? Si on parle bien de la même
chose, mes bouts de code compilent sans problème sous MacOS.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Erwan David
Le #22427241
JKB
Le Sat, 31 Jul 2010 23:05:56 +0000 (UTC),
Marc Espie
In article Alain BARTHE
Bonsoir,

Une petite question sur les fonctions en C : depuis quand peut-on en C
imbriquer la définition d'une fonction à l'intérieur d'une autre ?



C'est une extension specifique a gcc.

Ca pose d'eventuels problemes. C'est implemente avec une technique appelee
"trampolines", qui necessite dans pas mal de cas de rendre la pile executable,
ce qui la rend nettement plus sensible aux attaques de type buffer-overflow...



Que ce soit une extension, peut-être, je ne me suis jamais penché
sur ce problème. En revanche, je ne connais pas de compilo qui
refuse les fonctions imbriquées. gcc 2.7 l'autorisait déjà, DEC C
aussi, le compilo Sun n'est pas gêné... Aurais-tu des exemples ? Je
pose la question parce que pour une histoire de lisibilité,
j'utilise ça dans quelques programmes et je n'ai jamais eu un
utilisateur qui soit venu râler parce que la bibliothèque en
question refusait de compiler...



Le compilateur de Renesas pour H8S ne connait pas.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Publicité
Suivre les réponses
Poster une réponse
Anonyme