# Problème de compilation XCode



## kilik2049 (16 Novembre 2010)

Bonsoir à tous.
Je suis en train de coder en C++ avec XCode, et un problème étrange est apparu.
Ma compilation échoue, alors que tous les bugs sont résolus. Je vais voir, et XCode me dit que l'erreur se situe dans le fichier "Builds labs -> Compile class.ccp" au niveau de la ligne contenant:
_GLIBCXX_BEGIN_NAMESPACE(std)
avec pour intitulé d'erreur: Expected unqualified-id before "namespace"
Mon projet contient mon main (vierge), un fichier classe.ccp et son header associé.
Si le main est seul, avec le code de départ, la compile s'exécute sans problème, mais avec ces 3 fichiers, ça bloque, et je n'ai rien trouvé sur le net.
Je pense que je vais réinstaller XCode, mais avant ça, j'aimerais savoir si vous avez déjà entendu parler de ça !
Merci d'avance.


----------



## ntx (16 Novembre 2010)

Tu peux réinstaller tout ce que tu veux, moi je te parie que c'est un de tes fichier qui est foireux.  Il sort d'où ton fichier classe.ccp ? Qu'est-ce qu'il y a dedans ? Qu'est-ce que c'est que cette macro "_GLIBCXX_BEGIN_NAMESPACE" ?


----------



## kilik2049 (16 Novembre 2010)

Mon fichier classe.cpp c'est tout bêtement un fichier qui fait partie du projet. Voici l'intérieur.

#include "classe.h"
#include "main.cpp"


Cercle::Cercle(double r, double a, double o)
{    rayon = r;
    r >= 0;
    if (r<0) 
    {
        r=0;
    }
    abscisse = a;
    ordonnee = o; }

void Cercle::aireCercle(double r, double aire)
{
    aire = r * r * M_PI;
    cout << "Aire du cercle = " << aire << endl;
}

void Cercle:erimCercle(double r, double perim)
{
    perim = 2 * M_PI * r;
    cout << "Perimetre du cercle = " << perim << endl;
}

void Cercle::setRayon(double x)
{
    rayon = x;
}

void Cercle::setAbscisse(double y)
{
    abscisse = y;
}

void Cercle::setOrdonnee(double z)
{
    ordonnee = z;
}

Duree:uree(int h, int m, int s)
{    heure = h;
    minute = m;
    sec = s; 
    h >= 0;
    m >= 0;
    s >= 0;
    if (h || m || s < 0)
    {
        h = -h;
        m= -m;
        s = -s;
    }    
}
void Duree::setHeure(int he)
{
    heure = he;
}

void Duree::setMinute(int mi)
{
    minute = mi;
}

void Duree::setSec(int se)
{
    sec = se;
}

Rationelle::Rationelle(int n, int d)
{    numerateur = n;
    denominateur = d; 
    if (d=0)
    {
        d=1;
    }
}

void Rationelle::affichageFraction(int n, int d, double fraction)
{
    fraction = n/d;

    if (fraction > 0) 
    {
        cout << "La fraction est:" << n << "/" << d << endl;
    }
    else if (n/d < 0)
    {
        cout << "La fraction est:" << -n << "/" << d << endl;
    }
    else 
    {
        cout << "La fraction est nulle." << endl;
    }

}

void Rationelle::setNumerateur(int num)
{
    numerateur = num;
}

void Rationelle::setDenominateur(int den)
{
    denominateur = den;
}

Point:oint(double constrAbs, double constrOrd)
{
    abscissePoint = constrAbs;
    ordonneePoint = constrOrd;
}

void Point::affichage(double constrAbs, double constrOrd)
{
    cout << "L'abscisse du point est: " << constrAbs << endl;
    cout << "L'ordonnee du point est: " << constrOrd << endl;
}

void Point::setAbscissePoint(double abs)
{
    abscissePoint = abs;
}

void Point::setOrdonneePoint(double ord)
{
    ordonneePoint = ord;
}


La macro est dans un fichier que je ne connais pas. Je l'ai trouvé en faisant cette manip:
build & run
je vois qu'il y a des erreurs, je regarde le détail et je trouve ça.
Il est localisé apparemment dans:
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/localefwd.h:50

Voilà un screen:


----------



## ntx (16 Novembre 2010)

kilik2049 a dit:


> #include "main.cpp"


Tu l'as trouvée où celle là  


> cout << "Aire du cercle = " << aire << endl;


Le "std::" n'est pas optionnel devant les membres du namespace comme "cout", "endl", ... 

Pour t'en dispenser, ajoute un "using namespace std;" au début de ton code. mais c'est moins propre.

Comment as-tu créé ton projet dans Xcode ?


----------



## kilik2049 (16 Novembre 2010)

J'ai mis un "using namespace std;" dans mon main.cpp, c'est pour ça que j'ai fait un include du main 
Car si je met un "using namespace std;" seulement dans mon classe.cpp, XCode m'affiche plein d'erreurs, comme si "using namespace std;" n'était pas pris en compte.

Ben mon projet, j'ai démarré xcode => nouveau projet en ligne de commande C++ stdc++ (vu que j'ai pas C++ tout seul), et voilà


----------



## ntx (16 Novembre 2010)

kilik2049 a dit:


> J'ai mis un "using namespace std;" dans mon main.cpp, c'est pour ça que j'ai fait un include du main
> Car si je met un "using namespace std;" seulement dans mon classe.cpp, XCode m'affiche plein d'erreurs, comme si "using namespace std;" n'était pas pris en compte.


Quelle erreurs ? 

Chez moi les deux solutions compilent. :rateau: 
Donc fait un projet correct, et pas du bricolage avec des includes, et ça compilera.


----------



## kilik2049 (17 Novembre 2010)

Des erreurs comme quoi cout et endl ne sont pas valides (logique, si "using namespace std;" est pas pris en compte).
"cout was not declared in this scope"
"Expected unqualified-id before "using" "

En fait, le "using namespace std;" marche que s'il est dans le même fichier que ma fonction main. Donc je suis obligé d'inclure mon main...


----------



## Zeusviper (17 Novembre 2010)

kilik2049 a dit:


> J'ai mis un "using namespace std;" dans mon main.cpp


Pas terrible ça... tu pers de l'intérêt des namespaces.. peut être dommageable pour le futur de ton projet.




kilik2049 a dit:


> , c'est pour ça que j'ai fait un include du main
> Car si je met un "using namespace std;" seulement dans mon classe.cpp, XCode m'affiche plein d'erreurs, comme si "using namespace std;" n'était pas pris en compte.


et tu mets les includes adéquats dans ton classe.cpp avant d'accuser le namespace ?


```
#include <iostream>
using namespace std;
```


----------



## kilik2049 (17 Novembre 2010)

Exact, j'avais oublié le #include <iostream>
Mais ça ne change rien *facepalm*


----------



## Zeusviper (17 Novembre 2010)

L'erreur est probablement dans ton .h.
Copie-colle tes 3 fichiers complets ici  (balise CODE merci!)


écrire std::cout et std::cin reste dans tt les cas meilleur!


----------



## kilik2049 (17 Novembre 2010)

Main.cpp


```
#include <iostream>

using namespace std;


int main (int argc, char * const argv[]) {

    return 0;
}
```


classe.cpp


```
#include <iostream>
#include "classe.h"

using namespace std;

Cercle::Cercle(double r, double a, double o)
{    rayon = r;
    r >= 0;
    if (r<0) 
    {
        r=0;
    }
    abscisse = a;
    ordonnee = o; }

void Cercle::aireCercle(double r, double aire)
{
    aire = r * r * M_PI;
    cout << "Aire du cercle = " << aire << endl;
}

void Cercle::perimCercle(double r, double perim)
{
    perim = 2 * M_PI * r;
    cout << "Perimetre du cercle = " << perim << endl;
}

void Cercle::setRayon(double x)
{
    rayon = x;
}

void Cercle::setAbscisse(double y)
{
    abscisse = y;
}

void Cercle::setOrdonnee(double z)
{
    ordonnee = z;
}

Duree::Duree(int h, int m, int s)
{    heure = h;
    minute = m;
    sec = s; 
    h >= 0;
    m >= 0;
    s >= 0;
    if (h || m || s < 0)
    {
        h = -h;
        m= -m;
        s = -s;
    }    
}
void Duree::setHeure(int he)
{
    heure = he;
}

void Duree::setMinute(int mi)
{
    minute = mi;
}

void Duree::setSec(int se)
{
    sec = se;
}

Rationelle::Rationelle(int n, int d)
{    numerateur = n;
    denominateur = d; 
    if (d=0)
    {
        d=1;
    }
}

void Rationelle::affichageFraction(int n, int d, double fraction)
{
    fraction = n/d;
    
    if (fraction > 0) 
    {
        cout << "La fraction est:" << n << "/" << d << endl;
    }
    else if (n/d < 0)
    {
        cout << "La fraction est:" << -n << "/" << d << endl;
    }
    else 
    {
        cout << "La fraction est nulle." << endl;
    }
    
}

void Rationelle::setNumerateur(int num)
{
    numerateur = num;
}

void Rationelle::setDenominateur(int den)
{
    denominateur = den;
}

Point::Point(double constrAbs, double constrOrd)
{
    abscissePoint = constrAbs;
    ordonneePoint = constrOrd;
}

void Point::affichage(double constrAbs, double constrOrd)
{
    cout << "L'abscisse du point est: " << constrAbs << endl;
    cout << "L'ordonnee du point est: " << constrOrd << endl;
}

void Point::setAbscissePoint(double abs)
{
    abscissePoint = abs;
}

void Point::setOrdonneePoint(double ord)
{
    ordonneePoint = ord;
}
```

classe.h


```
#include <string>
#include <cmath>

class Cercle {
private:
    double rayon;
    double abscisse;
    double ordonnee;
public:
    Cercle(double r=0, double a=0, double o=0);
    void aireCercle(double r, double aire);
    void perimCercle(double r, double perim);
    void coordonnee();
    void setRayon(double x);
    void setAbscisse(double y);
    void setOrdonnee(double z);
    void point();
    void translation();
    void homotethie();
}

class Duree {
private:
    int heure;
    int minute;
    int sec;
public:
    Duree(int h=0, int m=0, int s=0);
    void affichage();
    void setHeure(int he);
    void setMinute(int mi);
    void setSec(int se);
    void convertir();
    void rajouterSeconde();
}

class Rationelle {
private: 
    int numerateur;
    int denominateur;
public: 
    Rationelle(int n=0, int d=0);
    void affichageFraction(int n, int d, double fraction);
    void setNumerateur(int num);
    void setDenominateur(int den);
    void inverse();
    void entier();
}

class Point {
private:
    double abscissePoint;
    double ordonneePoint;
public:
    Point(double constrAbs=0, double constrOrd=0);
    void affichage(double constrAbs, double constrOrd);
    void setAbscissePoint(double abs);
    void setOrdonneePoint(double ord);
}
```

(je ne savais pas qu'il y avait une balise code, je m'excuse pour le message précédant).


----------



## Zeusviper (17 Novembre 2010)

Alors :  
- dans le main.cpp supprimer le include et le using qui sont inutiles et déconseillés
- dans le classe.cpp, commence par inclure le . h avant les classes "utilitaires"
- une seule classe par fichier (Point.h/Point.cpp, Rationnelle.cpp/Rationnelle.h ...)
- et le responsable de ton erreur je suppose : dans le .h la déclaration de classe se finit par un ";" :

```
....
   void homotethie();
}[B] ; [/B]
```


----------



## kilik2049 (17 Novembre 2010)

Hallelujah, ça marche. C'était à cause des ";" oubliés à la fin des déclarations de classe !
Bon et bien, mille merci d'avoir pris du temps pour m'aider !


----------



## ntx (17 Novembre 2010)

kilik2049 a dit:


> Je pense que je vais réinstaller XCode


Pour quelques points virgules oubliés


----------

