关于C/C++中 Class, Struct, enum的定义声明位置
2010-09-06 15:52
477 查看
struct 和 enum定义的数据类型的作用域是本文件中。所以:
a. 当一个struct的数据类型定义定义在.h文件中,.h文件被多个.c包含,这些.c文件又一起连接时,不会出现数据类型重复定义的错误。但是如果这个.h文件在同一个.c中被多次展开,就出现了数据类型重复定义的问题。
b. struct 数据类型的定义,应该定义在.h文件中。也可以定义在.c中,在.h中做声明。
c. struct数据类型的定义和struct实例的定义是不同的,实例的定义的作用范围是整个编译对象。实例的定义一定要定义在.c中,如果外部有引用,在.h中作声明。
下面是CSDN上的一个讨论:
类,其实是数据类型的定义,和struct、enum的定义没有区别,
1、类型定义和对象定义是有区别的:
类型定义的作用范围和enum的定义是一样,类似const对象的默认作用域,文件内部作用域,所以即使被多个.c文件包含进去也不会发生类类型重定义,除非被一个c文件多次展开,多次展开的情况才用#ifndef _H_ #define _H_头文件哨兵避免,
但是非const对象定义就不同了,默认是extern作用域,所以被多个c文件包含就会发生对象重定义,用不用头文件哨兵都一样,这一点都没有回答到。
2、class A
{
....
};
是类型定义,也同时进行了一个类型声明,所以在很多书上直接说声明一个类,稍微不严谨;
class A;才是单纯类型声明,声明只是说明一个名字在此处用到,所以可以重复声明。
a. 当一个struct的数据类型定义定义在.h文件中,.h文件被多个.c包含,这些.c文件又一起连接时,不会出现数据类型重复定义的错误。但是如果这个.h文件在同一个.c中被多次展开,就出现了数据类型重复定义的问题。
b. struct 数据类型的定义,应该定义在.h文件中。也可以定义在.c中,在.h中做声明。
c. struct数据类型的定义和struct实例的定义是不同的,实例的定义的作用范围是整个编译对象。实例的定义一定要定义在.c中,如果外部有引用,在.h中作声明。
下面是CSDN上的一个讨论:
类,其实是数据类型的定义,和struct、enum的定义没有区别,
1、类型定义和对象定义是有区别的:
类型定义的作用范围和enum的定义是一样,类似const对象的默认作用域,文件内部作用域,所以即使被多个.c文件包含进去也不会发生类类型重定义,除非被一个c文件多次展开,多次展开的情况才用#ifndef _H_ #define _H_头文件哨兵避免,
但是非const对象定义就不同了,默认是extern作用域,所以被多个c文件包含就会发生对象重定义,用不用头文件哨兵都一样,这一点都没有回答到。
2、class A
{
....
};
是类型定义,也同时进行了一个类型声明,所以在很多书上直接说声明一个类,稍微不严谨;
class A;才是单纯类型声明,声明只是说明一个名字在此处用到,所以可以重复声明。
相关文章推荐
- 在C中用struct实现C++中class的函数声明和定义
- 在C中用struct实现C++中class的函数声明和定义
- 关于C++变量的声明和定义
- C++中可以用struct和class来定义类型,这两种类型有什么区别
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- C++:关于class member声明为static的情况
- 关于C_C++中struct与class的区别
- c与c++中enum和struct定义的区别
- Thinking in C++: C++中关于union、struct、class的区别
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- c/c++ struct的定义、声明、对齐方式
- C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
- c/c++中struct定义、声明、对齐方式解析
- c++对象模型(关于STRUCT和CLASS)
- 关于Swift中Struct,Class和Enum的哪些事儿 推荐
- 关于C++中声明,定义,初试化的理解
- 关于c++的struct与class区别
- C++ 关于声明,定义,类的定义,头文件作用,内、外链接
- c++中关于类(class)和结构体(struct)的区别个人总结