使用struct创建C对象时出现undefined reference错误:问题排查
解决"undefined reference to
newFeedEntry_REV_CONTAINER_ENTITY"错误及代码问题 咱们一步步拆解你的问题,先解决最显眼的错误,再修复代码里的隐藏坑:
1. 函数实现的致命问题:无限递归
你在.c文件里的函数实现犯了一个低级但致命的错误——无限递归:
FeedEntry_REV_CONTAINER_ENTITY *newFeedEntry_REV_CONTAINER_ENTITY() { FeedEntry_REV_CONTAINER_ENTITY *feedEntry_REV_CONTAINER_ENTITY; feedEntry_REV_CONTAINER_ENTITY = newFeedEntry_REV_CONTAINER_ENTITY(); // 这里直接调用了自己! feedEntry_REV_CONTAINER_ENTITY->TABLE_NAME = "MY_TABLE_NAME"; return feedEntry_REV_CONTAINER_ENTITY; }
这段代码没有给结构体分配任何内存,反而不断递归调用自己,会直接导致栈溢出崩溃。正确的写法是用malloc分配内存,还要检查分配是否成功:
#include <stdlib.h> // 必须包含这个头文件才能使用malloc FeedEntry_REV_CONTAINER_ENTITY *newFeedEntry_REV_CONTAINER_ENTITY() { // 分配对应结构体大小的内存 FeedEntry_REV_CONTAINER_ENTITY *entity = malloc(sizeof(FeedEntry_REV_CONTAINER_ENTITY)); if (entity == NULL) { // 一定要检查malloc是否成功,避免空指针访问 return NULL; } entity->TABLE_NAME = "MY_TABLE_NAME"; // 字符串常量直接赋值没问题 return entity; }
2. 编译链接错误导致"undefined reference"
这个错误是链接器找不到函数的实现,通常是因为你编译时没把定义了该函数的.c文件和你的实现代码文件一起编译。比如:
假设你的文件结构是:
feed.h(头文件)feed.c(函数实现文件)main.c(你的业务实现代码文件)
编译时要把所有相关的.c文件都包含进来:
gcc main.c feed.c -o my_program
如果只单独编译main.c,链接器就找不到newFeedEntry_REV_CONTAINER_ENTITY的实现,自然会报这个错。
3. 实现代码里的几个小问题(顺便修正)
你的业务代码还有几个语法和逻辑问题:
char *szSQL; /* Create SQL statement */ szSQL = "CREATE TABLE IF NOT EXISTS %s(" \ "id INTEGER PRIMARY KEY AUTOINCREMENT");"; FeedEntry_REV_CONTAINER_ENTITY *feedEntry_REV_CONTAINER_ENTITY; feedEntry_REV_CONTAINER_ENTITY = newFeedEntry_REV_CONTAINER_ENTITY(); cx = snprintf ( buffer, -1, (szSQL), feedEntry_REV_CONTAINER_ENTITY->TABLE_NAME ); puts (buffer);
修正点:
- SQL字符串拼接语法错误,最后多了一个
);,应该改成:szSQL = "CREATE TABLE IF NOT EXISTS %s(" "id INTEGER PRIMARY KEY AUTOINCREMENT);"; snprintf的第二个参数不能传-1,这是非法的,应该传入缓冲区的实际大小(比如你声明了char buffer[256];,就传sizeof(buffer)):cx = snprintf(buffer, sizeof(buffer), szSQL, feedEntry_REV_CONTAINER_ENTITY->TABLE_NAME);- 要确保
buffer已经被正确声明(比如char buffer[256];),还要检查newFeedEntry_REV_CONTAINER_ENTITY()的返回值是否为NULL,避免空指针访问:FeedEntry_REV_CONTAINER_ENTITY *entity = newFeedEntry_REV_CONTAINER_ENTITY(); if (entity == NULL) { // 处理内存分配失败的情况,比如打印错误提示 return 1; }
内容的提问来源于stack exchange,提问作者Program-Me-Rev
相关产品推荐
相关产品推荐

