struct 声明放在.h,定义在.c中,出现struct不可用的情况

kunp 2007-02-07 12:12:21
如果我把struct的定义和声明都放在.h中,在其他.c文件中使用这个struct是没有任何问题,但如果声明放在.h,定义在.c中,其他.c文件调用struct就会编译出错,各位有知道是为什么的么?

test.h
---------------------------------------------
#ifndef COMM_H
#define COMM_H

#include <stdio.h>
#include <stdlib.h>

struct test_st;
typedef struct test_st test_t;

void test();
#endif
----------------------------------------------

test.c
----------------------------------------------
#include "test.h"

struct test_st
{
int count;
char name[10];
};

----------------------------------------------

test2.c
----------------------------------------------
#include "test.h"

void test()
{
test_t t;
}

----------------------------------------------

编译时会报错:
----------------------------------------------
test2.c: In function `void test()':
test2.c:5: aggregate `test_t t' has incomplete type and cannot be defined
test2.c:5: warning: unused variable `<typeprefixerror> t'
-----------------------------------------------

...全文
4212 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jim_King_2000 2007-02-07
  • 打赏
  • 举报
回复
struct的定义不能隐藏。除非你在其它代码中不会用到该struct结构的对象。
kunp 2007-02-07
  • 打赏
  • 举报
回复
各位,我知道struct的定义放在.h里是肯定可以编译通过,但我想隐藏struct的定义,所以需要将struct的定义放在.c文件中,事实上,我也看到有这样的代码是可以编译通过的,如常用的xml解析库iksemel库就是这么做的,但奇怪的是,写法完全一样,上诉代码就是编译出错。
yevv 2007-02-07
  • 打赏
  • 举报
回复 1
简而言之 允许可独立编译单元内存在未定义的函数 不允许可独立编译单元内存在未定义存储(数据类型)! 可独立编译单元就是指.c文件
yevv 2007-02-07
  • 打赏
  • 举报
回复
不允许这样做吧
#include预编译指令就是把.h文件的内容地当作一段文本嵌入到.c内,一个.c文件(一个.c文件对编译器来说就是一个可独立编译的单元)内不能存在未定义的类型,因为如果类型未定义的话编译器独立编译它的时候显然不知道要为每个该类型的对象分配多大的内存空间,但是允许有未定义的函数,因为对于函数调用而言编译器仅仅需要知道一个函数地址就可以了,而这个工作可以到连接时再作,所以就允许编译器有未定义的函数,但是连接时如果存在未定义的函数就会报错!!

对于test2.c而言,它是一个可以独立编译的实体,对它的编译不会参照其他任何可独立编译单元,所以编译器对其进行独立编译的时候,无法获得struct test_st类型的具体信息就会报错!!!

要解决此问题 楼上正解!
jixingzhong 2007-02-07
  • 打赏
  • 举报
回复
文件结构应该是如上。

结构体等,
作为一种类型在 h 文件中声明起类型,
变量定义在 .c 文件中。
jixingzhong 2007-02-07
  • 打赏
  • 举报
回复
test.h
---------------------------------------------
#ifndef COMM_H
#define COMM_H

#include <stdio.h>
#include <stdlib.h>

//struct test_st; //注释掉这行
typedef struct test_st test_t;
struct test_st
{
int count;
char name[10];
};

void test();
#endif
----------------------------------------------

test.c
----------------------------------------------
#include "test.h"

void test()
{
test_t t;
}

----------------------------------------------
kunp 2007-02-07
  • 打赏
  • 举报
回复
test1?我就一个test.h的头文件。test2.c已经include了阿。
zhgc1983 2007-02-07
  • 打赏
  • 举报
回复
没看过有人这样写代码的,在用一个类型前必须有定义,你这样用根本就是在没有定义类型前就使用了类型,你这样分开来写一点意义都没有,反而制造了很多不必要的麻烦!
goodluckyxl 2007-02-07
  • 打赏
  • 举报
回复
把test1 include进去

struct test_st; 没什么用 去掉
kunp 2007-02-07
  • 打赏
  • 举报
回复 1
楼上各位,是我错了。

我仔细查看了一下iksemel的代码,调用的都是stuct的指针,而没有访问struct内部的成员,所有需要访问成员的地方,都提供了函数调用。事实正如Jim_King_2000() 和yevv(千年伐木) 所说,的确是我错了。多谢兄弟们。
blh 2007-02-07
  • 打赏
  • 举报
回复
只有变量、函数允许你的方法,编译器无法看到你在其他非include文件中定义的结构、枚举、宏
yevv 2007-02-07
  • 打赏
  • 举报
回复 1
如果编译器能够在不知道一个类型具体定义的情况下就为其分配存储 那我就从楼上跳下去! :)
yevv 2007-02-07
  • 打赏
  • 举报
回复
kunp(一天一小步) ( ) 信誉:101 Blog 2007-02-07 12:51:29 得分: 0


各位,我知道struct的定义放在.h里是肯定可以编译通过,但我想隐藏struct的定义,所以需要将struct的定义放在.c文件中,

!!!! "事实上,我也看到有这样的代码是可以编译通过的,如常用的xml解析库iksemel库就是这么做的,但奇怪的是,写法完全一样" !!!!!!!!!!!

,上诉代码就是编译出错。


___________________________________________________
没有可能编译通过 除非你自己写一个编译器 隐藏实现也不是你这么个隐藏法

70,039

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧