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()
所期望的)。
我是 运行 来自 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()
所期望的)。