Traduit de l'anglais par Philippe Elie
Les FAQs de la section [33]
[33.1]
Où puis-je charger un compilateur C++ gratuit?
[Fixé l'URL (on 10/99). "Chaînage" des modifications récentes .]Aller
voir http://www.progsource.com/c_development.html
pour une liste pour chaque plate-forme.
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.2]
Où puis-je trouver de l'information sur l'utilisation des
MFC et Visual C++?
[URL récemment mise a jour, merci a Katy Mulvey; changé le nom du mainteneur merci
(on 1/00).]La FAQ MFC/Visual C++ (mfcfaq.stingray.com/) est
maintenu par Michael Pickens (autrefois par Scot Wingo). Une autre FAQ
est disponible à www.mvps.org/vcfaq.
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.3]
Comment afficher du texte dans la barre de statut en utilisant
les MFC?
Utilisez cette portion de code: CString s =
"Text";
CStatusBar* p =
(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
p->SetPaneText(1, s);
Ceci
fonctionne avec MFC v.1.00 ce qui signifie (en étant optimiste)
que cela devrait fonctionner avec les autres versions.
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.4]
Comment puis je décompiler une exécutable vers du
code source C++?
Vous voulez plaisantez? Voici quelques unes des nombreuses qui
font que ceci est de loin infaisable:
- Pour commencer qu'est
ce qui penser que le programme est écrit en C++?
- Même
si vous êtes sur que le programme a été écrit
(au moins partiellement) en C++, quelle est le compilateur C++
qui l'a produit?
- Même si vous connaissez le compilateur
quelle version a été utilisé?
- Même
si vous connaissez le compilateur et le numéro de version, quelle
option de compilation on été utilisées pour produire
le programme?
- Même si vous connaissez le compilateur, sa
version et les options de compilation, quelles librairies tierces on été
liées avec, et quelles étaient leurs versions?
- Même
si vous connaissez tout ceci, la plupart des exécutables n'ont
plus d'informations de déboggage, aussi le résultat du code
décompilé sera totalement illisible.
- Même
si vous connaissez tout sur le compilateur, le vendeur, les versions,
les options de compilation, les librairies tierces et les informations
de deboggage, le coût d'écrire un décompilateur même
pour un seul compilateur particulier et avec un taux de sucès modeste
serait un effort monumental — du même ordre que d'écrire
un compilateur a partir de rien.
Mais la grande question n'est
pas commentvous pouvez décompiler le code de quelqu'un,
mais pourquoi? Si vous essayez de décompiler le code que
quelqu'un d'autre, honte sur vous; aller chercher du travail honnête.
Si vous essayez de récupérer vos propres sources perdu,
la meilleur suggestion que je puisse vous donnez est de faire de meilleur
sauvegarde la prochaine fois.
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.5]
Où puis-je trouver de l'information sur les compilateurs
C++ {Borland, IBM, Microsoft, Semantic, Sun, etc.}?
[Récemment ajouté merci a Edison Design Group C++ pour
la Matt Page (on
10/99), changé l'URL de Watcom C++ merci Stephen Howe; ajouté Comeau C++ merci a Gary Comeau (on 1/00). ]Par ordre alphabétique
et par ordre de vendeur:
[Si quelqu'un a d'autre suggestions pour cette liste, faites moi
le savoir; merci; (en anglais seulement) (cline@parashift.com)].
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.6]
Comment les compilateurs utilisent la technique "over-allocation"
pour enregistrer le nombre d'éléments d'un tableau alloué
dynamiquement?
Rappelez vous que lorsque vous faites un delete[]sur un tableau,
les librairies d'exécution connaît magiquement le nombre de destructeurs a appeler
. Cette FAQ décrit une technique
utilisé par certain compilateur C++ pour effectuer ceci (L'autre
technique commune est d' utiliser un tableau associatif ).
si le compilateur utilise la technique "over-allocation", le code pour
p = new Fred[n] ressemble a ce qui suit. Notez que WORDSIZE
est une constante dépendante de la machine qui est au moins égal
à sizeof(size_t), éventuellement arrondi pour
tenir compte de contrainte d'alignement. Sur la plupart des machines cette
constante aura la valeur 4 ou 8. Ce n'est pas un identificateur du C++
qui sera définit par le compilateur.
// Code d'origine: Fred* p = new Fred[n];
char* tmp = (char*) operator new[] (WORDSIZE +
n * sizeof(Fred));
Fred*
p = (Fred*) (tmp + WORDSIZE);
*(size_t*)tmp = n;
size_t
i;
try {
for (i = 0; i < n; ++i)
new(p +
i) Fred();
// opérateur
new avec syntaxe de de placement
} catch (...) {
while (i-- != 0)
(p + i)->~Fred();
// Appel explicite du
destructeur
operator delete[] ((char*)p - WORDSIZE);
throw;
}
Et les
delete[] p deviennent:
//
Code original: delete[] p;
size_t n = * (size_t*) ((char*)p - WORDSIZE);
while (n-- != 0)
(p + n)->~Fred();
operator
delete[] ((char*)p - WORDSIZE);
Notez que l'adresse passée
a l'opérateur operator delete[] n'est pas la même
que p.
Comparé a la technique tableau associatif , cette
technique est plus rapide, mais elle est plus sensible au problème
du programmeur qui écrit delete p plutôt que delete[]
p. Par exemple, si vous faites une erreur et écrivez delete
p ou vous devriez écrire delete[] p, l'adresse passée
à l'opérateur delete(void*) n'est pas l'adresse
d'une allocation valide. Ceci corrompra probablement le tas. Bang! Vous
êtes mort!
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.7]
Comment les compilateurs utilise-t-il une "tableau associatif"
pour enregistrer le nombre d'éléments d'un tableau alloué
dynamiquement?
Rappelez vous que lorsque vous faites un delete[]sur un tableau,
les librairies d'exécution connaît magiquement le nombre de destructeurs a appeler
. Cette FAQ décrit une technique
utilisée par certain compilateur C++ pour effectuer ceci (L'autre
technique commune est d' utiliser "l'over-allocation "). Si
le compilateur utilise un tableau associatif, le code pour p = new
Fred[n] ressemble a ceci (ou arrayLengthAssociation est
le nom imaginaire d'un tableau associatif global qui permet de retrouver
le taille (size_t) a partir d'un pointeur (void*)):
// Code original: Fred* p = new Fred[n];
Fred* p = (Fred*) operator new[] (n * sizeof(Fred));
size_t i;
try {
for (i = 0; i < n; ++i)
new(p + i) Fred();
// opérateur
new avec syntaxe de placement
} catch (...) {
while (i-- != 0)
(p + i)->~Fred();
// Appel explicite du
destructeur
operator delete[] (p);
throw;
}
arrayLengthAssociation.insert(p, n);
Et
les delete[] p deviennent:
// Code original: delete[] p;
size_t n = arrayLengthAssociation.lookup(p);
while (n-- != 0)
(p + n)->~Fred();
operator
delete[] (p);
Cfront utilise cette technique (Il utilise un
arbre AVL pour implémenter le tableau associatif).
Comparé
a la technique
"over-allocation" , le tableau associatif
est moins rapide, mais moins sensible au problème du programmeur
écrivant delete p plutôt que delete[] p.
Par exemple, si vous faites une erreur et vous écrivez delete
p là où vous devriez écrire delete[] p,
seulement le premier Fred dans le tableau sera détruit,
mais le tas ne sera pas corrompu (a moins que vous n'ayez remplacé
l'operator delete[] avec quelque chose qui n'appelle pas simplement
operator delete, ou a moins que les appels des destructeurs des
autres objets Fred étaient nécessaires).
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.8]
Si la décoration de nom était standardisé,
pourrais je lié du code produit par des compilateurs provenant
de différents fabriquants?
Réponse courte: Probablement non. En d'autres mots, certaine
personne aimerait que la décoration des noms soit incorporée
dans le standard ANSI C++ dans l'espoir d'éviter d'acheter l'acquisition
de différentes versions des librairies de classes pour différent
vendeurs de compilateurs. Toutefois la décoration des noms est
une des plus petite différences potentiels entre les implémentations,
même sur la même plate-forme.
Voici une liste partiel
des autres différences.
- Nombre et type des paramètres
cachés des fonctions membres.
-
- Est ce que this
this est traité spécialement?
- Ou le pointeur de
retour par valeur est passé?
- En présumant
qu'une v-table
est utilisé (N.D.T : table des
pointeurs de fonctions virtuels):
-
- Quelle est sont contenu
et son format?
- Ou/Comment l'ajustement du pointeur this
est fait pour les héritages et/ou l'héritage virtuel?
- Quelle est le format des tables en mémoire, incluant:
-
- Convention d'appel des
fonctions, incluant:
-
- ou les paramètres sont
ils passes?
- dans quel ordre les paramètres sont passés?
- quelles registres sont sauvegardés?
- ou la valeur de
retour est elle placé?
- Est ce l'appelant ou l'appelé
qui doit restauré la pile parés un appel?
- règles
spéciaux pour passer ou retourner une structure par valeur, un
nombre en virgule flottante?
- règles spéciaux pour
sauvegarder les registres lors de l'appel d'une fonction feuille (N.D.T
une fonction qui n'appelle pas d'autres fonctions)?
- Comment
le typage dynamique est il géré?
- Comment le système
de gestion des exceptions sait quels objets locaux doivent être
détruits lorsque une exception est lancée?
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.9]
GNU C++ (g++) produit de gros exécutable pour de petit programme,
pourquoi?
libg++ (le librairie utilisé par g++) a été probablement
compilée avec les infos de deboggage (-g). Sur certaine
machine, recompiler libg++ sans les informations de deboggage peut sauver
beaucoup d'espace disque (à peu prés 1 Mo; d'un autre coté:
vous ne pourrez plus tracer les appels à libg++). Seulement supprimer
les informations de deboggage de l'exécutable ne réclame
pas autant de recompilation que de recompiler sans l'option -gsuivant
par la suppression des informations de deboggage (N.D.T provenant de ligbg++).
Utilisé size a.out pour connaître la taille du
code et des données du programme, plutôt que ls -s a.out
qui inclut la taille des informations de deboggage.
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.10]
Existe-t-il une grammaire C++ au "format" yacc?
Il existe une grammaire (pour yacc) qui était proche du
C++. autant que je le sache, elle n'a pas évolué avec les
standard C++. Par exemple, cette grammaire ne grée pas les templates,
les "exceptions", ni les informations de type à l'exécution,
et elle dévie du langage sur d'autres points. Elle est disponible
à srawgw.sra.co.jp/.a/pub/cmd/c++grammar2.0.tar.gz
[ Haut | Bas
| Section précédente
| Section suivante
]
[33.11]
Qu'est ce que C++ 1.2? 2.0? 2.1? 3.0?
Ce ne sont pas des versions du langage C++, mais plutôt des versions
de cfront, qui était l'implémentation original du compilateur
C++ implementé par AT&T. Il a été généralement
accepté d'utiliser ces numéros de versions comme si elles
étaient des numéros de versions du langage lui-même.
Très grossièrement, elles incluent:
- 2.0
: héritage multiple/virtual et fonctions virtuel pur
- 2.1
support partiel des classes imbriqués et opérateur delete[]
de tableau de pointeur
- 3.0 support complet des classes imbriquées,
templates, et surcharge différentes des opérateurs i++
vs.++i
- 4.0 support des exceptions
[ Haut | Bas
| Section précédente
| Section suivante
]
Ecrire à l'auteur,
au traducteur,
ou en savoir plus sur la traduction.
[ C++ FAQ Lite fr |
Table des matières |
Index |
A propos de l'auteur |
© |
Téléchargez votre propre copie ]
Dernière révision le 12 Nov 2002