sqlite3_exec回调函数第一个参数类型转换报错求助
问题解决
你的代码里有几个关键错误导致编译失败,逐一修正如下:
1. 结构体定义语法错误
typedef_struct 是拼写错误,正确写法是 typedef struct。
2. 回调函数中类型转换的优先级问题
编译器报错的核心原因是:-> 运算符的优先级高于强制类型转换。你直接写 (OBJ_DATA *)adat->cvalue,编译器会先尝试访问 adat->cvalue,但 adat 是 void* 类型,无法直接用 -> 访问成员,所以触发报错。
必须把强制转换后的指针整体用括号括起来,确保先完成类型转换,再访问结构体成员。同时你的 strcpy 参数写法也有括号缺失问题,需要一并修正。
3. 其他细节问题
main函数需要明确返回类型int。ErrMsg应该声明为char *ErrMsg = NULL;,符合sqlite3_exec的参数要求。- sqlite3的回调函数需要返回
int值,通常返回0表示继续执行后续逻辑。
修正后的完整代码
typedef struct obj_data { int ivalue; char cvalue[200]; } OBJ_DATA; OBJ_DATA adat; static int callback_Members(void *adat, int argc, char** argv, char** azColName) { // 先将void*强制转换为OBJ_DATA*,再访问结构体成员 strcpy( ((OBJ_DATA *)adat)->cvalue, argv[0]); return 0; } int main() { sqlite3 *db = NULL; char *sql_command = "SELECT ..."; // 替换为你的实际查询语句 char *ErrMsg = NULL; int rc; // 省略打开数据库的代码... rc = sqlite3_exec(db, sql_command, callback_Members, &adat, &ErrMsg); if (rc != SQLITE_OK) { // 错误处理逻辑 sqlite3_free(ErrMsg); } // 省略关闭数据库等后续代码... return 0; }
内容的提问来源于stack exchange,提问作者Jeff McKay
相关产品推荐
相关产品推荐

