5

Al intentar compilar el archivo, me aparece el error mencionado en el título. error: ISO C++ forbids converting a string constant to 'char' [-Wpedantic] en la línea 28 del fichero. Adjunto el código.

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

int main(int argc, char* argv[])
{
    sqlite3 *db;
    char *error = 0;
    int res;
    char *sql;

    /* Open database */
    res = sqlite3_open("prob.db", &db);
    if (res)
    {
        fprintf(stderr, "No se pudo abrir base de datos: %s\n", sqlite3_errmsg(db));
        exit(0);
    }
    else
    {
        fprintf(stderr, "Base de datos OK\n");
    }

    sql = "CREATE TABLE events ("
          "'timestamp' DATETIME, "
          "'level' NUMBER, "
          "'type' NUMBER, "
          "'message' TEXT)"; //En esta linea figura el error

    res = sqlite3_exec(db, sql, NULL, 0, &error);
    if (res != SQLITE_OK)
    {
        fprintf(stderr, "Error: %s\n", error);
        sqlite3_free(error);
    }
    else
    {
        fprintf(stdout, "Tabla creada!\n");
    }

    sqlite3_close(db);

    return 0;
}

Quisiera saber que es lo que puede estar ocasionando este problema. Muchas gracias.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Vale
  • 51
  • 1
  • 2

2 Answers2

3

El mensaje de error, en traducción libre, viene a decir:

error: El estandar ISO prohibe asignar una cadena literal a un char *

Y eso es sencillamente lo que te está pasando: "CREATE TABLE events ..." es una cadena literal; el lenguaje dicta que las cadenas literales no se pueden modificar. Y tú, al usar un char *, podrías intentar modificarlas.

Si echamos una mirada a la función sqlite3_exec( ), vemos que su prototipo es:

int sqlite3_exec(
  sqlite3*,
  const char *sql,
  int (callback)(void,int,char**,char**),
  void *,
  char **errmsg
);

Su segundo argumento es del tipo const char *, es decir, espera una cadena constante que no se modificará dentro de la función.

Pues listo. No hay ningún motivo para usar un char * (puntero a cadena que podemos modificar). Por lo tanto, nos basta con hacer

int main(int argc, char* argv[])
{
  sqlite3 *db;
  char *error = 0;
  int res;
  const char *sql;
  ...

Nos basta con cambiar el tipo de tu variable sql a const char *sql.

Trauma
  • 25,297
  • 4
  • 37
  • 60
1

El error es claro y conciso, tal vez no lo entiendas por estar en inglés, permíteme traducirlo:

Error: ISO C++ forbids converting a string constant to 'char*'

Error: ISO C++ prohíbe convertir una cadena constante a 'char*'


En tu código tienes una cadena constante:

"CREATE TABLE events ("
"'timestamp' DATETIME, "
"'level' NUMBER, "
"'type' NUMBER, "
"'message' TEXT)"

El tipo de esta cadena es const char[90], fíjate que es constante. No puedes apuntar a datos constantes con punteros no constantes. Para solucionar el error, simplemente declara sql como puntero a datos constantes:

const char *sql;
~~~~~
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82