variable que programacion poner para manejo funciones dev como cadenas cadena c++ string explicit-constructor

que - string dev c++



Conversión obsoleta de C++ de constante de cadena a ''char*'' (9)

Como respuesta no. 2 by fnieto - Fernando Nieto describe clara y correctamente que esta advertencia se da porque en algún lugar de tu código estás haciendo (no en el código que publicaste) algo así como:

void foo(char* str); foo("hello");

Sin embargo, si desea mantener su código libre de advertencias, solo realice los cambios respectivos en su código:

void foo(char* str); foo((char *)"hello");

Es decir, simplemente convierte la string constante en (char *) .

Tengo una clase con un private char str[256];

y para ello tengo un constructor explícito:

explicit myClass(const char *func) { strcpy(str,func); }

Lo llamo así:

myClass obj("example");

Cuando compilo esto recibo la siguiente advertencia:

conversión obsoleta de constante de cadena a ''char *''

¿Por qué está pasando esto?


De hecho, un literal constante de cadena no es ni const char * ni con char *, sino con char []. Es bastante extraño, pero escrito en las especificaciones c ++; Si lo modifica, el comportamiento no está definido porque el compilador puede almacenarlo en el segmento de código.


Este es un mensaje de error que aparece cada vez que tiene una situación como la siguiente:

char* pointer_to_nonconst = "string literal";

¿Por qué? Bueno, C y C ++ difieren en el tipo de cadena literal. En C, el tipo es una matriz de caracteres y en C ++ es una matriz constante de caracteres. En cualquier caso, no está permitido cambiar los caracteres del literal de la cadena, por lo que la const en C ++ no es realmente una restricción, sino más bien algo de tipo seguridad. Una conversión de const char* a char* generalmente no es posible sin un lanzamiento explícito por razones de seguridad. Pero por compatibilidad con C, el lenguaje C ++ aún permite asignar un literal de cadena a un char* y le da una advertencia acerca de que esta conversión está en desuso.

Por lo tanto, le faltan una o más const en su programa para const correctness. Pero el código que nos mostró no es el problema, ya que no hace este tipo de conversión obsoleta. La advertencia debe haber venido de algún otro lugar.


Hay 3 soluciones:

Solución 1:

const char *x = "foo bar";

Solución 2:

char *x = (char *)"foo bar";

Solución 3:

char* x = (char*) malloc(strlen("foo bar")+1); // +1 for the terminator strcpy(x,"foo bar");

Las matrices también se pueden usar en lugar de punteros porque una matriz ya es un puntero constante.


La advertencia:

conversión obsoleta de constante de cadena a ''char *''

se da porque estás haciendo algo (no en el código que publicaste) algo así como:

void foo(char* str); foo("hello");

El problema es que estás tratando de convertir un literal de cadena (con tipo const char[] ) a char* .

Puede convertir un const char[] en const char* porque la matriz decae en el puntero, pero lo que está haciendo es hacer que un mutable sea constante.

Probablemente esta conversión esté permitida para la compatibilidad con C y solo le da la advertencia mencionada.


Lo siguiente ilustra la solución, asigne su cadena a un puntero variable a una matriz constante de char (una cadena es un puntero constante a una matriz constante de información de longitud de onda adicional):

#include <iostream> void Swap(const char * & left, const char * & right) { const char *const temp = left; left = right; right = temp; } int main() { const char * x = "Hello"; // These works because you are making a variable const char * y = "World"; // pointer to a constant string std::cout << "x = " << x << ", y = " << y << ''/n''; Swap(x, y); std::cout << "x = " << x << ", y = " << y << ''/n''; }


Por lo que vale, creo que esta clase de contenedor simple es útil para convertir cadenas de C ++ a char * :

class StringWrapper { std::vector<char> vec; public: StringWrapper(const std::string &str) : vec(str.begin(), str.end()) { } char *getChars() { return &vec[0]; } };


Resuelvo este problema agregando esta macro al principio del código, en alguna parte. O <iostream> , jeje.

#define C_TEXT( text ) ((char*)std::string( text ).c_str())


También tengo el mismo problema. Y lo que hice simple es simplemente agregar const char * en lugar de char *. Y el problema resuelto. Como otros han mencionado anteriormente, es un error compatible. C trata a las cadenas como matrices de caracteres, mientras que C ++ las trata como matrices const de tipo char.