私有成员变量(如在C++中)是否可以在C中实现,如何实现?我想到静态全局变量将变量的范围限制为定义它的文件,但是如何从其他文件访问它?有没有办法在C中实现私有成员变量?
您需要为此创建一个opaque类型,两个以相同字段开头的结构,然后您可以将私有字段添加到其中一个,并且永远不会让用户访问具有私有字段的字段.
然后提供访问器函数来修改/读取结构中的私有字段.
一个例子胜过千言万语
struct.c
#include <stdlib.h>
struct Private
{
int public;
int private;
};
struct Public
{
int public;
};
struct Public *new_public(int private, int public)
{
struct Private *instance;
instance = malloc(sizeof(*instance));
if (instance == NULL)
return NULL;
instance->private = private;
instance->public = public;
return (struct Public *)instance;
}
int public_get_private(struct Public *public)
{
if (public == NULL)
return -1; /* or some invalid value */
return ((struct Private *)public)->private;
}
void public_set_private(Public *public, int value)
{
if (public == NULL)
return;
((struct Private *)public)->private = value;
}
Run Code Online (Sandbox Code Playgroud)
struct.h
#ifndef __STRUCT_H__
#define __STRUCT_H__
struct Public
{
int public;
};
typedef struct Public Public;
Public *new_public(int private, int public);
int public_get_private(Public *instance);
void public_set_private(Public *instance, int value);
/* you can add more fields to the structures and more access functions */
#endif
Run Code Online (Sandbox Code Playgroud)
main.c中
#include "struct.h"
#include <stdlib.h>
#include <stdio.h>
int main()
{
Public *instance;
instance = new_public(1, 2);
if (instance == NULL)
return -1;
printf("%d\n", instance->public);
printf("%d\n", public_get_private(instance));
free(instance);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
new_public() 充当构造函数.private通过public_get_private()作为成员函数的函数获取值.private从Public结构中访问该成员.当然你可以做愚蠢的事情
Public *public = malloc(sizeof(*public));
Run Code Online (Sandbox Code Playgroud)
但那就是我对c所发现的如此甜蜜,你可以自由地做任何你想做的事,只是不要做错事.
我也认为这比private成员更好,因为定义和实现细节都是从库用户隐藏的.