OVH Cloud OVH Cloud

static, cout et portabilite

6 réponses
Avatar
Cyril.Gruau
Puisque certains compilateurs ne construisent pas std::cout
avant mes objets static (pgcc 3.2 par exemple),
comment je fais pour afficher quelque chose a la construction
de mes objets static ?

Je suis oblige d'utiliser printf pour assurer la portabilite ?

Cyril

6 réponses

Avatar
Jean-Marc Bourguet
(Cyril Gruau) writes:

Puisque certains compilateurs ne construisent pas std::cout
avant mes objets static (pgcc 3.2 par exemple),
comment je fais pour afficher quelque chose a la construction
de mes objets static ?


Il faut construire une variable statique de type std::ios_base::Init
avant tes variables.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Cyril.Gruau
Il faut construire une variable statique de type std::ios_base::Init
avant tes variables.


D'accord mais ou ?

J'ai ajoute

static std::ios_base::Init x;

dans le namespace global
ou dans la declaration de ma classe, sans succes.

Cyril

Avatar
Samuel Krempp
le Vendredi 22 Août 2003 17:32, écrivit :

Il faut construire une variable statique de type std::ios_base::Init
avant tes variables.


D'accord mais ou ?

J'ai ajoute

static std::ios_base::Init x;

dans le namespace global
ou dans la declaration de ma classe, sans succes.


Mettre les var statiques dans des fonctions pour s'assurer de l'ordre
d'instanciation est une technique expliquée dans le 'Effective C++'.

Dans ton cas, il suffirait d'agir dans le corps des constructeurs de tes
variables statiques qui veulent afficher.
si j'ai bien compris ce que tu veux, tu peux faire comme :

void avant_d_afficher() {
static std::ios_base::Init x;
}

class Toto {
public :
Toto() {
avant_d_afficher();
std::cout << " on intialise un Toto n";
}
};

static Toto toto;


--
Sam
Enlever les mots en trop dans mon e-mail pour répondre


Avatar
Cyril.Gruau
Mettre les var statiques dans des fonctions pour s'assurer de l'ordre
d'instanciation est une technique expliquée dans le 'Effective C++'.

Dans ton cas, il suffirait d'agir dans le corps des constructeurs de tes
variables statiques qui veulent afficher.
si j'ai bien compris ce que tu veux, tu peux faire comme :

void avant_d_afficher() {
static std::ios_base::Init x;
}

class Toto {
public :
Toto() {
avant_d_afficher();
std::cout << " on intialise un Toto n";
}
};

static Toto toto;


Ca continue de ne pas marche avec pgCC
(cela fonctionne pourtant avec g++ et cl.exe).

Voici mon code reduit a sa plus simple expression :

**********
dans .h :
**********

class MaClasse
{
public:
MaClasse();

private:
// je suis contraint d'utiliser un char * par ma hierarchie
static char * chaine;
static MaClasse exemplaire;
};

*************
dans .cpp :
*************

#include <iostream>
#include "MaClasse.h"

using namespace std;

char * MaClasse::chaine = "blabla";
MaClasse MaClasse::exemplaire = MaClasse() ;

void avant_d_afficher() {
static std::ios_base::Init x;
}

MaClasse::MaClasse()
{
avant_d_afficher();
cout << chaine << endl;
}

**********
resultat :
**********

Memory fault(coredump)

Tandis qu'avec un printf, ca fonctionne

Avatar
Samuel Krempp
le Lundi 25 Août 2003 18:27, écrivit :

Ca continue de ne pas marche avec pgCC
(cela fonctionne pourtant avec g++ et cl.exe).


au fait, c'est quoi pgCC ? si il s'obstine à faire planter ton exe, tu peux
essayer diverses choses en esperant eviter le bug.

par exple, au lieu d'avoir
class MaClasse {
[..]
static MaClasse exemplaire;
[..]
}

tu pourrais faire une fction membre statique
static MaClasse& MaClasse::UnExemplaire() {
static MaClasse exemplaire=MaClasse();
return exemplaire;
}

et appeler MaClasse::UnExemplaire() qd tu veux acceder à cette instance
statique.
Je crois me rappeler que la construction de la variable se fera au moment du
premier appel de la fonction UnExemplaire(), donc plus tard qu'avec ta
construction actuelle, et avec un peu de chance à ce moment std::cout sera
déja prêt à fonctionner.


--
Sam
Enlever les mots en trop dans mon e-mail pour répondre

Avatar
Cyril.Gruau
au fait, c'est quoi pgCC ?


Il s'agit du compilateur C++ de Portland Group
(mon code doit malheureusement etre portable sur ce compilateur).


si il s'obstine à faire planter ton exe, tu peux
essayer diverses choses en esperant eviter le bug.

par exple, au lieu d'avoir
class MaClasse {
[..]
static MaClasse exemplaire;
[..]
}

tu pourrais faire une fction membre statique
static MaClasse& MaClasse::UnExemplaire() {
static MaClasse exemplaire=MaClasse();
return exemplaire;
}


Effectivement on peut eviter le probleme ainsi.

Mais il n'en reste pas moins que cout est inutilisable
pendant l'instanciation des membres static.

Cyril