Una razón para este problema (que es aún más difícil de detectar que el problema con el char* str = "some string"
que otros han explicado) es cuando está usando constexpr
.
constexpr char* str = "some string";
Parece que se comportaría de manera similar y const char* str
, por lo tanto, no causaría una advertencia, como ocurre antes char*
, sino que se comporta como char* const str
.
Detalles
Puntero constante y puntero a una constante. La diferencia entre const char* str
, y char* const str
se puede explicar de la siguiente manera.
const char* str
: Declara que str es un puntero a un const char. Esto significa que los datos a los que apunta este puntero son constantes. El puntero se puede modificar, pero cualquier intento de modificar los datos arrojaría un error de compilación.
str++ ;
: VÁLIDO . Estamos modificando el puntero, y no los datos apuntados.
*str = 'a';
: NO VÁLIDO . Estamos tratando de modificar los datos que se apuntan.
char* const str
: Declara que str es un puntero constante para char. Esto significa que el punto ahora es constante, pero los datos que se apuntan también no lo son. El puntero no se puede modificar, pero podemos modificar los datos utilizando el puntero.
str++ ;
: NO VÁLIDO . Estamos tratando de modificar la variable del puntero, que es una constante.
*str = 'a';
: VÁLIDO . Estamos tratando de modificar los datos que se apuntan. En nuestro caso, esto no causará un error de compilación, pero sí un error de tiempo de ejecución , ya que la cadena probablemente irá a una sección de solo lectura del binario compilado. Esta afirmación tendría sentido si hubiéramos asignado dinámicamente memoria, por ejemplo. char* const str = new char[5];
.
const char* const str
: Declara que str es un puntero constante para un char constante. En este caso, no podemos modificar el puntero ni los datos a los que se apunta.
str++ ;
: NO VÁLIDO . Estamos tratando de modificar la variable del puntero, que es una constante.
*str = 'a';
: NO VÁLIDO . Estamos tratando de modificar los datos apuntados por este puntero, que también es constante.
En mi caso, el problema era que esperaba constexpr char* str
comportarme como const char* str
y no char* const str
, ya que visualmente parece más cercano al anterior.
Además, la advertencia generada para constexpr char* str = "some string"
es ligeramente diferente de char* str = "some string"
.
- Advertencia del compilador para
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- Advertencia del compilador para
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
.
Propina
Puede usar el convertidor de inglés C gibberish to para convertir C
declaraciones en declaraciones en inglés fácilmente comprensibles, y viceversa. Esta es una C
herramienta única y, por lo tanto, no admitirá cosas (como constexpr) que son exclusivas de C++
.
strncpy(str, func, 255)
lugar destrcpy(str, func)
una copia más segura. Y luego no olvide agregar el '\ 0' al final de la cadena ya que strncpy no lo agrega.