Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c语言中实现公共、私有和受保护的关键字?_C - Fatal编程技术网

如何在c语言中实现公共、私有和受保护的关键字?

如何在c语言中实现公共、私有和受保护的关键字?,c,C,有人可以给我举个例子。假设静态变量的作用域仅限于文件。这是该文件的私有部分。像这样,我想知道更多的例子。换句话说,如何使用当前可用的关键字(STRUCT、STATIC…等)实现C语言中的数据隐藏概念您必须重写/扩展编译器,向lexigraphic单元添加新语法(这可能是最简单的部分),最重要的是,添加新规范。如果你将这些关键字添加到C语言中,你将不再拥有C语言,而是一个派生词。您的代码不会被任何其他编译器理解。此外,这些不仅仅是关键字,它们是特定的预期行为,您不能只实现关键字,您必须为该语言添加

有人可以给我举个例子。假设静态变量的作用域仅限于文件。这是该文件的私有部分。像这样,我想知道更多的例子。换句话说,如何使用当前可用的关键字(STRUCT、STATIC…等)实现C语言中的数据隐藏概念

您必须重写/扩展编译器,向lexigraphic单元添加新语法(这可能是最简单的部分),最重要的是,添加新规范。如果你将这些关键字添加到C语言中,你将不再拥有C语言,而是一个派生词。您的代码不会被任何其他编译器理解。此外,这些不仅仅是关键字,它们是特定的预期行为,您不能只实现关键字,您必须为该语言添加完整的OOP支持。如果这就是你的计划——祝你好运

数据隐藏是托管语言的一项功能,因为有一个独立于您的程序的运行时来处理幕后事务,这在C语言中是不存在的。如果您想拥有这些功能(数据隐藏和其他仅限于托管语言的抽象),您必须准确地生成这样的构造,实现一个运行时来处理幕后事务。然后,也只有这样,您才能实现数据隐藏和其他抽象

C根本不提供这些可能性,程序中的任何代码都可以访问进程虚拟内存中的任何地址,执行您计划的任何操作


我的建议是,即使这对你来说很难:为此使用一种托管语言。C语言不是实现您想要做的事情的正确语言

您必须重写/扩展编译器,向lexigraphic单元添加新语法(这可能是最简单的部分),最重要的是,添加新规范。如果你将这些关键字添加到C语言中,你将不再拥有C语言,而是一个派生词。您的代码不会被任何其他编译器理解。此外,这些不仅仅是关键字,它们是特定的预期行为,您不能只实现关键字,您必须为该语言添加完整的OOP支持。如果这就是你的计划——祝你好运

数据隐藏是托管语言的一项功能,因为有一个独立于您的程序的运行时来处理幕后事务,这在C语言中是不存在的。如果您想拥有这些功能(数据隐藏和其他仅限于托管语言的抽象),您必须准确地生成这样的构造,实现一个运行时来处理幕后事务。然后,也只有这样,您才能实现数据隐藏和其他抽象

C根本不提供这些可能性,程序中的任何代码都可以访问进程虚拟内存中的任何地址,执行您计划的任何操作

我的建议是,即使这对你来说很难:为此使用一种托管语言。C语言不是实现您想要做的事情的正确语言

是的,内部链接(静态)有效地使文件私有化。不过,你不一定需要这些。您可以通过在源文件中定义一个结构并仅向用户提供一个typedef和一组函数来模拟具有私有成员的类。除了“构造函数”之外,所有函数都将采用显式的“this”参数。您的faux构造函数只需分配类型的实例并返回指针。由于所有函数都将在与结构相同的源中定义(使用外部链接),因此它们可以看到成员。只能看到typedef和函数原型的用户不能

在这种情况下,通过让函数返回指向内部声明实例的指针,您可以使用static来模拟单例。

是的,内部链接(static)有效地使文件私有化。不过,你不一定需要这些。您可以通过在源文件中定义一个结构并仅向用户提供一个typedef和一组函数来模拟具有私有成员的类。除了“构造函数”之外,所有函数都将采用显式的“this”参数。您的faux构造函数只需分配类型的实例并返回指针。由于所有函数都将在与结构相同的源中定义(使用外部链接),因此它们可以看到成员。只能看到typedef和函数原型的用户不能


在这种情况下,通过让函数返回指向内部声明实例的指针,您可以使用static来模拟单例。

您可以使用私有头(比如
xyz_private.h
)来定义私有结构(比如
struct xyz_private_t
)。在公共标题中,你可以这样做

typedef struct xyz_private_t *xyz_ptr_t;    or

typedef struct {
  ... some public members ...
  struct xyz_private_t *private;
} mytype_t;
<>这与C++中的PIMPL相似。


无法区分private、friend和protected-文件可以/确实访问private头,或者不能/不访问private头。

您可以使用private头(比如
xyz\u private.h
)定义私有结构(比如
struct xyz\u private\u t
)。在公共标题中,你可以这样做

typedef struct xyz_private_t *xyz_ptr_t;    or

typedef struct {
  ... some public members ...
  struct xyz_private_t *private;
} mytype_t;
<>这与C++中的PIMPL相似。


私密、朋友、受保护无法区分-文件可以/确实访问私密头,或者它不能/不访问。

这家伙是嵌入式系统的世界权威之一。他用c写了这篇关于OOP的白皮书


这家伙是世界上嵌入式系统的权威之一。他用c写了这篇关于OOP的白皮书


C++最初是作为C的预编译器,带有诸如Glockenspiel和CFront之类的预编译器。你可以找到你正在寻找的东西(它也提供来源)


如果你没有从中找到线索,我认为在C中实现真正的数据隐藏的唯一方法是将变量声明为函数的静态变量。

C++最初是作为C的预编译器,带有诸如Glockenspi之类的预编译器