[C语言]

头文件中不可以定义全局变量,为什么可以定义结构体

[复制链接]
3587|16
手机看帖
扫描二维码
随时随地手机跟帖
yanghelovehuang|  楼主 | 2018-8-27 16:58 | 显示全部楼层 |阅读模式
一叶倾城wwq| | 2018-8-27 17:59 | 显示全部楼层
这个需要查阅C99或者ANSI C标准,但估计也不会说是为什么这样规定,只是对于使用者而言仅仅只是“是否需要让其他文件调用该结构体”的问题,看楼下有没有人解答

使用特权

评论回复
john_lee| | 2018-8-27 18:23 | 显示全部楼层
你所说的“定义结构体”,实际上是不严格的说法。正确的说法是:声明结构体。

声明(declare),是向编译器宣称了一个新的类型。
而定义(define,不要和宏搞混了),是使用一个类型定义一个新的常量或变量。

使用特权

评论回复
linqing171| | 2018-8-27 20:48 | 显示全部楼层
结构体是类型。类型可以声明多次,好像还可以不一样... ...
结构体类型的变量才是变量。

使用特权

评论回复
lddfym| | 2018-8-27 21:40 | 显示全部楼层
typedef是类型重定义,即定义了一个数据类型,而非定义了一个变量,故不存在重复定义的问题。

使用特权

评论回复
lddfym| | 2018-8-27 21:40 | 显示全部楼层
typedef是类型重定义,即定义了一个数据类型,而非定义了一个变量,故不存在重复定义的问题。

使用特权

评论回复
ayb_ice| | 2018-8-28 08:29 | 显示全部楼层
当然可以定义的,不过要点技巧

使用特权

评论回复
w451198326| | 2018-8-28 16:31 | 显示全部楼层
应该是声明结构体,定义变量。比如说你定义一个全局变量后,就会在ram内某处开辟一个空间。声明的话当然不会了。同样如果你在头文件中定义结构体类型变量,也会报错

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-28 17:10 | 显示全部楼层
w451198326 发表于 2018-8-28 16:31
应该是声明结构体,定义变量。比如说你定义一个全局变量后,就会在ram内某处开辟一个空间。声明的话当然不会 ...

我在h文件里定义了结构体变量,也没报错,我是这样定义的:
typedef struct{
}VIFI;

extern VIFI vifi_t;
VIFI是结构体类型。

是不是在h文件里定义的全局变量前加个extern就不会报错了。?

使用特权

评论回复
mcu5i51| | 2018-8-28 17:16 | 显示全部楼层
加个extern 就是声明了;

使用特权

评论回复
caijie001| | 2018-8-28 19:20 | 显示全部楼层
声明与定义的概念混淆了

使用特权

评论回复
caijie001| | 2018-8-28 19:20 | 显示全部楼层
yanghelovehuang 发表于 2018-8-28 17:10
我在h文件里定义了结构体变量,也没报错,我是这样定义的:
typedef struct{
}VIFI;

定义了吗?内存在哪呢

使用特权

评论回复
yanghelovehuang|  楼主 | 2018-8-29 09:19 | 显示全部楼层
caijie001 发表于 2018-8-28 19:20
定义了吗?内存在哪呢

里面的成员只是没写出来而已,这不是为了重点吗。

使用特权

评论回复
chongdongchen| | 2018-8-29 09:58 | 显示全部楼层
h文件的内容想怎么写都可以,没有任何规定,只受限于你的工程结构。
只不过因为经验的总结,h文件会作一些写法上的限制,就是各种规范。

使用特权

评论回复
gnaijnaoul| | 2018-8-30 08:25 | 显示全部楼层
楼主需要去学习一下c程序编译,链接的原理。编译的过程是。预处理器将c文件包含的头文件展开,将头文件内容添加到c文件形成中间文件,然后编译器再编译这个c文件。

使用特权

评论回复
luofeng2g| | 2018-8-30 09:26 | 显示全部楼层
declare 和 define

使用特权

评论回复
suqiancollege| | 2020-4-1 08:29 | 显示全部楼层
本帖最后由 suqiancollege 于 2020-4-1 08:31 编辑

那个不叫定义,叫声明一个结构体
声明(.h):
typedef struct {
                       int a;
                       char b;
}Struct_T;   //这是声明
定义(.c)
Struct_T  kkk; //这是定义,这样kkk里就有a和b两个成员

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝