Erreurs et avertissements des compilateurs C++ améliorés par Clang

De RAD Studio
Aller à : navigation, rechercher

Remonter à Compilateurs C++ améliorés par Clang


Contrôle des messages d'avertissement

L'option Activer tous les avertissements (sur Projet > Options > Compilateur C++ > Avertissements) invoque le compilateur avec l'option -Weverything, qui est un sur-ensemble de -Wall (pour toutes les constructions "faciles à éviter").

Les avertissements peuvent être activés ou supprimés individuellement, ce qui requiert le nom de l'avertissement. Pour afficher ces noms, passez -fdiagnostics-show-option au compilateur. En procédant ainsi, vous modifiez un avertissement comme cela :

File1.cpp:32:11: warning: unused variable 'foo'

en :

File1.cpp:32:11: warning: unused variable 'foo' [-Wunused-variable]

Vous pouvez ensuite utiliser -Wunused-variable pour activer spécifiquement cet avertissement sans activer les autres. Pour désactiver cet avertissement, remplacez le -W de début par -Wno-, et utilisez-le en combinaison avec une option pour activer le niveau d'avertissement souhaité. Par exemple : -Wall -Wno-unused-variable active tous les avertissements "faciles à éviter", excepté pour les variables inutilisées.

Erreurs fréquentes lors du portage depuis BCC32

Le code porté depuis BCC32 peut présenter certaines de ces erreurs (listées par ordre alphabérique, sans tenir compte des marques de réservation telles que 'x').

'x' ne fait pas référence à une valeur (dans le template)

Les noms de types qui sont dépendants du paramètre du template doivent être précédés de typename. S'il est omis, vous obtenez par exemple :

 template <class T>
 void doSomething() {
   T::member *var;
 }

Un * destiné à la déclaration de pointeur sera en fait interprété comme une multiplication. Par ailleurs, si la variable prévue se trouve être dans la portée, l'erreur se produira (tentative de multiplication d'un nom de type qui n'est pas une valeur, comme 'member' dans cet exemple).

'typename' manquant avant le nom de type dépendant 'x'

Les noms de types qui sont dépendants du paramètre du template doivent être précédés de typename. S'il est omis, d'autres erreurs peuvent être générées dans certains cas, mais en principe l'erreur et la solution sont claires.

La fusion de tokens a formé 'x', un jeton non valide

La fusion de tokens avec l'opérateur ## du préprocesseur doit former un seul token valide. Dans de nombreux cas, l'opérateur n'est pas nécessaire en premier lieu ; il suffit simplement de le retirer pour résoudre le problème.

Le symbole public 'x' est défini dans les modules A et B

Par exemple :

[ilink64 Error] Error: Public symbol 'triplet::sum' defined in both module C:\USERS\WIN764\NODES.O and C:\USERS\WIN764\UNIT1.O

Les membres de données statiques doivent être déclarés dans un en-tête et définis une seule fois dans un fichier source (pas dans l'en-tête).

ILINK64 est documenté ici : Utilisation de ILINK32 et ILINK64 en ligne de commande.

Utilisation d'un identificateur 'x' non déclaré (dans le template)

A cause de la recherche de noms en deux phases dans les templates, les identificateurs trouvés dans les classes de base ne sont pas résolus à moins qu'ils ne soient qualifiés avec this->.

Par ailleurs, les noms de types qui sont dépendants du paramètre du template doivent être précédés de typename. S'il est omis, vous obtenez par exemple :

 template <class T>
 void doSomething() {
   T::member *var;
 }

Un * destiné à la déclaration de pointeur sera en fait interprété comme une multiplication. A moins que la variable ne soit déjà dans la portée, l'erreur se produira (tentative de multiplication de la valeur de template par un identificateur non déclaré, comme 'var' dans cet exemple).

Avertissements fréquents lors du portage depuis BCC32

Le code porté depuis BCC32 peut présenter certains de ces avertissements (listés par ordre alphabétique), qui peuvent être supprimés.

La conversion d'un littéral chaîne en 'char *' est désapprouvée

-Wdeprecated-writable-strings

L'assignation d'un pointeur char simple en chaîne C littérale n'est pas recommandée. Transformez le pointeur en const (et si approprié, pensez à utiliser std::string).

Signature des modifications de conversions implicites

-Wsign-conversion

BCC32 ignore un assignement de signé en non signé. Les compilateurs C++ basés sur Clang remarquent de tels assignements et émettent un message d'erreur ou d'avertissement.

Voir aussi