You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:29:58