[CPP] prototype pas obligatoire ?

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [CPP] prototype pas obligatoire ?

Message  jonas le Dim 02 Jan 2011, 11:36

Bonjour,

tout d'abord... Bonne année !

ensuite... ma question :
Je pensais qu'on avait dit lors du cours, qu'en C++ les prototypes des fonctions étaient obligatoires (en fait c'est même la première chose que j'ai noté (à tord ?) dans mes notes de C++).

Pourtant ce code (d'une ancienne interro) compile sans même un warning :

Code:

#include <iostream>
using namespace std;

class C
{
   int i;
   public :
   C(int j) : i(j) {}
   int & inc() {
   ++i;
   return i;
   }
};

int & machin()
{
   static C c(23);
   return c.inc();
}

int main() {
   cout << machin() << endl;
   cout << ++machin() << endl;
   cout << machin() << endl;
}

Pas de prototype pour la fonction machin().
Pas de prototype pour les méthodes (là je veux bien qu'elles ne sont pas des "fonctions").

Alors les prototypes ne sont pas obligatoires finalement ?

remarque:
config avec -pedantic-errors et -enable-auto-import


Dernière édition par jonas le Dim 02 Jan 2011, 13:06, édité 1 fois

jonas

Nombre de messages : 234
Prénom : Jonathan
Statut : Ancien industrialisé
Localisation : Devant son clavier BÉPO !
Date d'inscription : 29/09/2008

http://www.xax.be

Revenir en haut Aller en bas

resolu Re: [CPP] prototype pas obligatoire ?

Message  nvs le Dim 02 Jan 2011, 12:35

ici on donne mieux qu'un prototype : la définition de la classe et de la fonction.

le compilateur c++ vérifie les arguments d'appels d'une fonction ou d'une méthode. pour être capable de réaliser cette vérification le compilateur doit connaître certaines informations. soit il connaît l'implémentation complète de la fonction / méthode (comme dans le cas présenté par jonas), soit il ne connaît que le strict minimum, c'est-à-dire le prototype de la fonction ou la définition de la classe.

en bonne pratique, les différentes classes et les fonctions sont définies et implémentées dans des fichiers différents, d'où l'obligation de fournir le prototype des fonctions.

donc, le code
Code:
#include <iostream>
using namespace std;

class C
{
  int i;
  public :
  C(int j) : i(j) {}
  int & inc() {
  ++i;
  return i;
  }
};

int & machin()
{
  static C c(23);    // C connu du compilateur
  return c.inc();    // C::inc() connu du compilateur
}

int main() {
  cout << machin() << endl;    // machin connu du compilateur
  cout << ++machin() << endl;
  cout << machin() << endl;
}
compile sans soucis, mais pas
Code:
#include <iostream>
using namespace std;

class C
{
  int i;
  public :
  C(int j) : i(j) {}
  int & inc() {
  ++i;
  return i;
  }
};

int main() {
  cout << machin() << endl;    // machin inconnu du compilateur : erreur
  cout << ++machin() << endl;
  cout << machin() << endl;
}

int & machin()
{
  static C c(23);    // C connu du compilateur
  return c.inc();    // C::inc() connu du compilateur
}
ni
Code:
#include <iostream>
using namespace std;

int & machin()
{
  static C c(23);    // C inconnu du compilateur : erreur
  return c.inc();    // C::inc() inconnu du compilateur erreur
}

class C
{
  int i;
  public :
  C(int j) : i(j) {}
  int & inc() {
  ++i;
  return i;
  }
};

int main() {
  cout << machin() << endl;    // machin connu du compilateur
  cout << ++machin() << endl;
  cout << machin() << endl;
}
mais bien
Code:
#include <iostream>
using namespace std;

int & machin();

class C
{
  int i;
  public :
  C(int j) : i(j) {}
  int & inc() {
  ++i;
  return i;
  }
};

int main() {
  cout << machin() << endl;    // machin connu du compilateur
  cout << ++machin() << endl;
  cout << machin() << endl;
}

int & machin()
{
  static C c(23);    // C connu du compilateur
  return c.inc();    // C::inc() connu du compilateur
}

le compilateur c quant à lui vérifie les arguments d'appels de fonction sauf s'il rencontre une fonction dont il ne sait rien (ni son implémentation ni son prototype), auquel cas il accepte toujours l'appel.








cyclops

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [CPP] prototype pas obligatoire ?

Message  jonas le Dim 02 Jan 2011, 13:06

ok

merci Smile

jonas

Nombre de messages : 234
Prénom : Jonathan
Statut : Ancien industrialisé
Localisation : Devant son clavier BÉPO !
Date d'inscription : 29/09/2008

http://www.xax.be

Revenir en haut Aller en bas

resolu Re: [CPP] prototype pas obligatoire ?

Message  Contenu sponsorisé Aujourd'hui à 20:40


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum