El siguiente fragmento de código (correctamente) da una advertencia en C y un error en C++ (usando gcc & g ++ respectivamente, probado con versiones 3.4.5 y 4.2.1; MSVC no parece Care):¿Por qué no puedo convertir 'char **' a 'const char * const *' en C?
char **a;
const char** b = a;
Puedo entender y aceptar esto.
La solución de C++ a este problema es cambiar b para que sea un const char * const *, que no permite la reasignación de los punteros y evita que eluda la corrección de const (C++ FAQ).
char **a;
const char* const* b = a;
Sin embargo, en C puro, la versión corregida (utilizando const char * const *) todavía da una advertencia, y no entiendo por qué. ¿Hay alguna forma de evitar esto sin utilizar un elenco?
Para aclarar:
1) ¿Por qué esto genera una advertencia en C? Debería ser completamente seguro, y el compilador de C++ parece reconocerlo como tal.
2) ¿Cuál es la forma correcta de aceptar este carácter ** como parámetro mientras digo (y hacer que el compilador haga cumplir) que no voy a modificar los caracteres a los que apunta? Por ejemplo, si quería escribir una función:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
Y quería invocar en un char **, lo que sería el tipo correcto para el parámetro?
Edit: Gracias a quienes han respondido, especialmente a los que respondieron la pregunta y/o dieron seguimiento a mis respuestas.
He aceptado la respuesta de que lo que quiero hacer no se puede hacer sin un molde, independientemente de si es posible o no.
Estoy confundido en cuanto a su pregunta, es: "¿Cómo hago para que C no me advierta?" o es "¿Cómo puedo obtener C++ para no lanzar un error de compilación?" O tal vez no sea ninguno de estos. – user7116
Estoy de acuerdo con sixlettervariables, esta pregunta necesita más aclaraciones. –
La pregunta es "¿por qué no puedo convertir 'char **' en 'char * const *?" – Kevin