0

我正在编写一个小 shell 作为课程练习,它模拟 bash 的自动完成和历史机制,生成一个用于管理用户命令的 main.c 文件和一个用于在原始模式下管理终端的 raw.c 文件。

除了 raw.c 的 get_line() 方法之外,项目中的任何文件都不太可能需要调用任何东西,因此我的直觉是只在 raw.h 中包含这个 get_line() 方法,以防止意外访问另一个 raw.c 方法和进一步的复杂性。

在哪里可以找到关于 C 访问控制技术的良好入门和/或讨论,特别是模拟 OO 语言的私有/公共概念是否是一个好主意,如果是,通常如何完成?

4

3 回答 3

3

首先要做的事情是:“OO 的私有/公共概念”不是“访问控制”。即使某些东西是“私有的”,它仍然存在,并且仍然可以访问。您已经保护它免受意外访问,但这与“保护”它相去甚远(从“授权”的角度来看)。一个坚定的和/或恶意的客户仍然可以得到它,因为“安全”不是那些机制的目的。

一旦你理解了这一点,你就会意识到所有那些“可见性”的东西——无论你是在标题中声明一些东西,还是将它设为公共与私有,或者其他什么——基本上都是为了可维护性:减少当前范围内的标识符数量,减少在给定上下文中必须考虑的函数和变量的数量。

然后,你说你的“本能是只在 raw.h 中包含这个 get_line() 方法”。你知道这是错误的措辞吗?您可以在头文件中声明该函数,可以包含该头文件,但不包含函数。

所以。您实现属于翻译单元(main.c、raw.c)的函数。您在该翻译单元的头文件 (raw.h) 中声明可能从该翻译单元外部调用的函数。所有不能从外部调用的函数,您static在翻译单元本身内部定义,并且根本不在标题中声明它们。

至于模仿另一种语言的概念,不要。以您当前使用的语言做事,或使用不同的语言。

于 2013-11-14T09:36:00.203 回答
1

raw.c当然应该声明私有函数static(并从公共标头中省略)。然后它们只能从同一个“编译单元”,即从内部可见和可调用raw.c

于 2013-11-14T09:34:43.103 回答
1

只应将公共方法放入.h

私有方法必须static在文件顶部声明.c

如果您的模块正在使用多个.c文件,则不应将该函数放入 public .h。相反,您应该创建第二个私有.h,例如:mymodule_p.h而不是mymodule.h. 它就像一个受保护的功能

于 2013-11-14T09:35:08.333 回答