L'extrait de code suivant donne (correctement) un avertissement en C et une erreur en C++ (en utilisant respectivement gcc et g++, testés avec les versions 3.4.5 et 4.2.1 ; MSVC ne semble pas s'en soucier) :
char **a;
const char** b = a;
Je peux comprendre et accepter cela.
La solution C++ à ce problème consiste à transformer b en un const char * const *, ce qui interdit la réaffectation des pointeurs et vous empêche de contourner la const-correctness ( FAQ C++ ).
char **a;
const char* const* b = a;
Cependant, en C pur, la version corrigée (utilisant const char * const *) donne toujours un avertissement, et je ne comprends pas pourquoi. Existe-t-il un moyen de contourner ce problème sans utiliser un cast ?
Pour clarifier :
1) Pourquoi cela génère-t-il un avertissement en C ? Il devrait être entièrement const-safe, et le compilateur C++ semble le reconnaître comme tel.
2) Quelle est la bonne façon de procéder pour accepter ce char** comme paramètre tout en disant (et en faisant en sorte que le compilateur l'applique) que je ne modifierai pas les caractères vers lesquels il pointe ? Par exemple, si je voulais écrire une fonction :
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
Et je voulais l'invoquer sur un char**, quel serait le type correct pour le paramètre ?
0 votes
Je suis confus quant à votre question, est-elle : "Comment faire pour que le C ne m'avertisse pas ?" ou "Comment faire pour que le C++ ne fasse pas d'erreur de compilation ?" Ou peut-être que ce n'est ni l'un ni l'autre.
0 votes
Je suis d'accord avec sixlettervariables, cette question doit être clarifiée.
0 votes
La question est "pourquoi je ne peux pas convertir 'char**' en 'char const ?"
0 votes
Je veux dire "char**" pour "const char". const '
0 votes
J'ai mis à jour la question pour qu'elle soit plus claire. Kevin a la bonne idée, mais je l'ai développée.
0 votes
@HappyDude : Quelqu'un d'autre me l'a d'abord expliqué. Puis j'ai regardé dans le projet de norme C (je suis trop radin pour acheter une copie de la norme officielle).
1 votes
Une chose à noter est que MSVC n'est pas vraiment conforme aux normes. C compilateur.