C语言结构体变量私有化

操作系统 : CentOS7.3.1611_x64

gcc版本 :4.8.5

问题描述

C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化?

解决方案

将结构体的定义放入源码件中实现,头文件只放声明。

比如有如下结构体(obj.h文件中定义):

struct Obj {
    int id;
    char *name;
};
typedef struct Obj Obj;

并定义如下变量:

Obj *o;

正常情况下,可以通过如下代码正常访问结构体中的变量:

printf("id : %d\n",o->id);

如果将结构体的定义放入源文件中,上述代码将会报如下错误:

error: dereferencing pointer to incomplete type
   printf("id : %d\n",o->id);

如需外部访问,可通过添加相关接口实现,比如:

int get_obj_id(const Obj* o)
{
    int ret = 0;
    if(o)
    {
        ret = o.id;
    }
    return ret;
}

完整示例代码如下:

https://github.com/mike-zhang/cppExamples/tree/master/dataTypeOpt/CStructPrivateTest1

好,就这些了,希望对你有帮助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2018/20180628_C语言结构体变量私有化.rst

欢迎补充

原文地址:https://www.cnblogs.com/MikeZhang/p/CStructPrivateTest20180628.html

时间: 2024-11-05 12:24:20

C语言结构体变量私有化的相关文章

C语言结构体变量字节对齐问题总结

结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据: 2)提高存取数据的速度.比如有的平台每次都是从偶地址处读取数据,对于一个int型的

C语言结构体变量内存分配与地址对齐

地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下规则: 原则1:数据成员对齐规则:结构的数据成员,第一个数据成员放在偏移量(offset)为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 原则2:收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

C语言中两个相同类型的结构体变量之间是可以相互直接赋值的

C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量之间是可以相互赋值的.但是要注意指针的浅层复制问题. 下面是一个简单的验证代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> struct test

C语言中结构体变量之间赋值

最近,我阅读了某新员工小刘写的C语言代码,发现其对结构体变量之间的赋值不是很熟悉.对于两个相同类型的结构体变量,他均采用的是逐个成员变量直接赋值的形式.如下的代码示例: 如上代码所示,tEmployeeInfoSrc和tEmployeeInfoDest是两个类型相同的结构体变量,tEmployeeInfoSrc(源结构体变量)中的各个成员变量已赋初值.现要使tEmployeeInfoDest(目的结构体变量)中的各个成员变量的值与tEmployeeInfoSrc中对应成员变量的值相同.小刘采用的

c语言:通过指向结构体变量的指针变量输出结构体变量中成员的信息

通过指向结构体变量的指针变量输出结构体变量中成员的信息. 解:程序: #include<stdio.h> #include<string.h> int main() { struct Student { long int num; char name[20]; char sex[10]; float score; }; struct Student stu_1;//定义struct Student类型的变量stu_1 struct Student *p; p = &stu_

c语言:用结构体变量输出学生的信息,包括学号,姓名,性别。

用结构体变量输出学生的信息,包括学号,姓名,性别. 解:程序: #include<stdio.h> int main() { struct Student { long int num; char name[20]; char sex[5]; char addr[20]; }a = {1010,"yaoyao","Man","xi'an"};//定义结构体变量a并初始化 printf("num:%ld\nname:%s\ns

C语言 指向结构体变量的指针

一个指向变量的指针表示的是占内存中起始位置 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组 定义结构体变量的指针: //假设已有一个结构体名为Student struct Student *pStruct // 结构体类型 * 指针名; 通过指针来引用结构体中的成员,有三种方式 demo: 1 # include <stdio.h> 2 # include <stdlib.h> 3 /* 4 1.使用->引用结构体成员 5

【C语言】有n个结构体变量,内含学生号, 姓名和三门课成绩。要求输出平均成绩最高学生的信息。

//有n个结构体变量,内含学生号, 姓名和三门课成绩.要求输出平均成绩最高学生的信息. #include <stdio.h> #define N 3 struct Student { int num; char name[20]; float socre[3]; float aver; }; void input(struct Student stu[]) { int i; printf("Çë·Ö±ðÊäÈë¸÷ѧÉúµÄÐÅÏ¢£ºÑ§ºÅ£¬ÐÕÃû£¬ÈýÃſγɼ¨\