Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonctions imbriquées en C

33 réponses
Avatar
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\n", 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

3 réponses

1 2 3 4
Avatar
JKB
Le Mon, 02 Aug 2010 14:37:07 +0200,
Antoine Leca écrivait :
JKB écrivit :
Le Mon, 02 Aug 2010 13:41:16 +0200,
Antoine Leca écrivait :
JKB écrivit :
La question est maintenant de savoir pourquoi je ne me suis pas
encore fait engueuler par les gens qui utilisent SunStudio...


C++ ? Code non compilé à cause d'un #ifndef OPTIMISATION ?



Absolument pas. Code compilé _et_ fonctionnel.



Euh ? Si d'un côté on te reporte que le compilo MachinBiniou n'a pas la
fonctionnalité, tu ne peux pas être assuré que *ce* compilateur accepte
ton code et que de plus le code fonctionne comme tu l'as prévu : cela
supposerait que tu disposes toi-même du compilo en question, et là je ne
comprends plus ta remarque sur les engueulades... (tu ne vas t'engueuler
toi-même ;-) )



La fonction est un truc qui calcule des itinéraires. Si elle ne
fonctionnait pas, le programme tout entier s'arrêterait sur un
message d'erreur. En plus, il affiche l'itinéraire sur une carte. Je
suis donc sûr que le programme a été compilé et qu'il donne un
résultat correct.

Je ne me suis donc jamais penché sur le problème. Je viens de jeter
un oeil sur mon code et il contient bien :

declareExternalFunction(init)
declareObject(connector);
declareObject(department);
declareObject(departments);
declareObject(graph);
declareObject(numberOfContexts);
declareObject(query);

...

void freeEdgesArray()
{
}

void createIndex()
{
...
void swap(void target(x), void target(y), integer s
{
}
}

...
endExternalFunction

Bon, ça passe dans un préprocesseur maison, mais c'est compilé par
un vulgaire compilo C.

J'ai eu une fois un effet un peu similaire : j'avais trois compilateurs
qui se mélangeaient les uns aux autres, et pour des tests je ne voulais
pas que GCC soit utilisé... et je ne comprenais pas pourquoi j'obtenais
les mêmes résultats "avec" ou "sans" GCC :-( En fait ce qui se passait
c'est que dans le processus de compilation (qui était trop compliqué et
pas assez surveillé), d'abord le chemin menant à gcc était rajouté à
l'insu de mon plein gré (à cause de binutils), ensuite la valeur de $CC
était « oublié » dans un sous-sous-shell, et enfin autoconf préfère gcc
à cc/c89, à ma surprise (sur le coup). Au final, le code « intéressant »
était quand même compilé par GCC, et une fois lié avec le frontal (pour
une fois, mort aux ABI compatibles ;-)) on obtenait positivement le même
programme...
Je ne pense pas que ton problème se ramène à un truc aussi alambiqué (et
surtout aussi mal foutu que mon machin), mais je crois que tant que tu
n'as pas mis les mains sur l'instance de ton projet compilé avec
MachinBiniou, tu ne peux pas être sûr.



Certes. L'utilisateur final compile peut-être à l'insu de son plein
gré avec un gcc des familles...

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
Avatar
xtof pernod
Le 02/08/2010 13:52, JKB a fait rien qu'à écrire:
Le Mon, 02 Aug 2010 13:41:16 +0200,
Antoine Leca écrivait :
JKB écrivit :
La question est maintenant de savoir pourquoi je ne me suis pas
encore fait engueuler par les gens qui utilisent SunStudio...



C++ ? Code non compilé à cause d'un #ifndef OPTIMISATION ?



Absolument pas. Code compilé _et_ fonctionnel.




Parce qu'ils ne s'en servent pas ?

--
christophe.
Avatar
JKB
Le Mon, 02 Aug 2010 17:12:58 +0200,
xtof pernod écrivait :
Le 02/08/2010 13:52, JKB a fait rien qu'à écrire:
Le Mon, 02 Aug 2010 13:41:16 +0200,
Antoine Leca écrivait :
JKB écrivit :
La question est maintenant de savoir pourquoi je ne me suis pas
encore fait engueuler par les gens qui utilisent SunStudio...



C++ ? Code non compilé à cause d'un #ifndef OPTIMISATION ?



Absolument pas. Code compilé _et_ fonctionnel.




Parce qu'ils ne s'en servent pas ?



Si, et ça, j'en suis sûr.

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
1 2 3 4