IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Fonction incluse en C++


Sujet :

C++

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut Fonction incluse en C++
    Bonjour

    Pardonnez ma question de débutant. Je me démerde pas trop mal en C mais je débute en C++.

    Et justement j'ai un souci. En C il est depuis quelque temps possible d'inclure des fonctions dans d'autres fonctions. Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void toto() {
    	void titi() {
    		printf("titi\n");
    	}
    	titi();
    }

    Partant de là, j'ai tenté de faire la même chose en C++ mais le compilo me jette. Il semble que ce ne soit pas possible en C++. Or le C++ étant au-moins autant capable que le C, je pensais que ce qui pouvait se faire en C serait aussi possible en C++.

    Donc est-ce possible d'inclure une fonction dans une autre en C++ ? Y a-t-il une syntaxe spéciale pour ça ? Je vous avoue que ça m'arrangerait que ce le soit.

    Merci à tous.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    Or le C++ étant au-moins autant capable que le C
    Sur le plan syntaxique, c'est faux. De plus, C++ étant plus strict que C, beaucoup de choses ne sont pas permises.

    Pour avoir l'équivalent de ce que tu cherche, il y a les lambdas: https://en.cppreference.com/w/cpp/language/lambda.

    auto titi = [] { printf("titi\n"); };

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    De plus, C++ étant plus strict que C, beaucoup de choses ne sont pas permises.
    Oui, je commence à le voir. La vache qu'est-ce que je me prends dans la tronche par le compilo C++ !!! Pourtant mon programme C que je cherche à porter en C++ compile avec les options les plus strictes sans warning...

    Citation Envoyé par jo_link_noir Voir le message
    Pour avoir l'équivalent de ce que tu cherche, il y a les lambdas: https://en.cppreference.com/w/cpp/language/lambda.
    auto titi = [] { printf("titi\n"); };
    Merci de ton retour. Ok je m'en suis sorti. Je ne dis pas que ce sera toujours aussi facile mais pour l'instant, comme le type qui tombe de la tour, jusque là ça va

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 586
    Points : 7 724
    Points
    7 724
    Par défaut
    Bizarre,
    A ma connaissance, les fonctions imbriquées sont interdites aussi bien en C qu'en C++. C'est juste une capacité qu'utilise gcc pour compenser le fait que le C n'a pas les lambda.
    En C++ on peut peut par contre avoir une classe à interne à une fonction, et cette classe peut avoir des fonctions membres. Mais les lambda sont bien plus puissantes (parce ce qu'elles peuvent accéder simplement aux variables de la fonction englobante)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void gct() {
    	struct  Intern {
    		static void  fct() {
    			std::cout <<  "fct interne" ;
    		}
    	};
    	Intern::fct();
     
    	int  x = 42;
    	auto  hct = [&]{ std:cout << "valeur de x " << x; };
    	hct();
    }

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    A ma connaissance, les fonctions imbriquées sont interdites aussi bien en C qu'en C++. C'est juste une capacité qu'utilise gcc pour compenser le fait que le C n'a pas les lambda.
    Etrange de dire "c'est interdit mais le compilo l'accepte"
    Pourtant même en activant les options les plus strictes (-Wall -Werror --ansi) ça compile (ma version C avec fonctions incluses je veux dire)

    Citation Envoyé par dalfab Voir le message
    En C++ on peut peut par contre avoir une classe à interne à une fonction, et cette classe peut avoir des fonctions membres.
    Oui, jusque là ça restait dans le domaine de mes faibles connaissances C++

  6. #6
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 492
    Points : 6 200
    Points
    6 200
    Par défaut
    Citation Envoyé par dalfab Voir le message
    A ma connaissance, les fonctions imbriquées sont interdites aussi bien en C qu'en C++. C'est juste une capacité qu'utilise gcc pour compenser le fait que le C n'a pas les lambda.
    Je confirme. Dans la documentation de GCC, la fonctionnalité Nested Functions est bien rangée dans Extensions to the C Language Family et la doc indique que cette extension n'est pas disponible pour C++ :
    Nested functions are supported as an extension in GNU C, but are not supported by GNU C++.

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Pourtant même en activant les options les plus strictes (-Wall -Werror --ansi) ça compile (ma version C avec fonctions incluses je veux dire)
    -ansi ne désactive pas toutes les extensions du compilateur, il faut ajouter -pedantic/-Wpedantic, voir carrément -Werror=pedantic.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    voir carrément -Werror=pedantic.
    Ah oui, effectivement là la compilation pue carrément.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction incluse (via include) non exécutée
    Par bendu dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2017, 16h31
  2. fonction incluse dans class
    Par chama luna dans le forum C++
    Réponses: 4
    Dernier message: 13/03/2017, 20h30
  3. Réponses: 6
    Dernier message: 10/08/2006, 12h11
  4. fonctions ou inclusions de fichiers
    Par V_R46 dans le forum Langage
    Réponses: 5
    Dernier message: 30/06/2006, 19h15
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo