sqlite '=': 无法从 'const char [164]' 转换为 'char *'

sqlite '=': cannot convert from 'const char [164]' to 'char *'

我是 运行 来自 here 的 sqlite 代码示例,用于在 C++ 中创建 table,这里是代码:

#include "../contrib/sqlite/sqlite3.h"

static int callback(void* NotUsed, int argc, char** argv, char** azColName) {
    int i;
    for (i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

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

    /* Open database */
    rc = sqlite3_open("test.db", &db);

    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return(0);
    }
    else {
        fprintf(stdout, "Opened database successfully\n");
    }

    /* Create SQL statement */
    sql = "CREATE TABLE COMPANY("  \ // Error is here at the '='
        "ID INT PRIMARY KEY     NOT NULL," \
        "NAME           TEXT    NOT NULL," \
        "AGE            INT     NOT NULL," \
        "ADDRESS        CHAR(50)," \
        "SALARY         REAL );";

    /* Execute SQL statement */
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        fprintf(stdout, "Table created successfully\n");
    }
    sqlite3_close(db);
    return 0;
}

但后来我从 visual studio 2022 得到了一些错误,说:

a value of type "const char *" cannot be assigned to an entity of type "char *"

'=': cannot convert from 'const char [164]' to 'char *'

有谁知道如何解决这个错误?

问题出在您的 sql 变量上。它是一个char*指针,是指向non-const字符数据的指针。但是您试图将它分配给指向字符串文字,这是 const 字符数据(在本例中为 const char[164] 数组)。分配 non-const 字符指针指向 const 字符数据是危险的,因为它允许 read-only 字符串可变,这是未定义的行为。在 C(你正在看的例子是为它编写的)和旧版本的 C++ 中,这样的赋值是合法的(尽管不推荐),但在 C++11 以后它是非法的。

您需要将 sql 的声明更改为 const char*(这正是 sqlite3_exec() 所期望的)。