gpt4 book ai didi

c - 如何控制对无法设为私有(private)的公共(public) C 函数的访问

转载 作者:行者123 更新时间:2023-11-30 15:20:27 36 4
gpt4 key购买 nike

当“静态”声明不可行时,如何在 ANSI C 下实现或模拟私有(private)访问行为(即只有我的软件模块中的代码才能“成功”调用函数)?

背景:

我的处境很奇怪。

我必须开发一个大型软件模块,它作为我们软件的大量输入(数千个)的抽象来运行,由访问函数呈现 - 我将进一步将它们称为信号。该模块对大多数信号执行一些类似的映射操作,例如将表示形式从整数更改为浮点,更改物理单位或将标称值重新映射为其他值 - 取决于信号的语义和性质。此外,一些验证(如输入集/范围检查)是按信号进行的,并且还对信号及其组(访问函数的返回值)进行了一些常见的错误验证。

现在我们的测试部门想要测试小组功能 - 单位(tm) - 就像每个输入信号组一样,当然还要测试输入例程,映射例程和重新分组的输出例程彼此独立,这完全有道理。

但是由于测试内容的严格规则,每个可测试单元必须表示为自己的 C 对象,并在我们发布它时进行测试。为此,任何输入、映射和输出例程都需要外部接口(interface)。我们提供了一个库,可以集成到更大的软件系统中。

现在,任何输入和输出例程都是非常特殊的(在某种程度上),因为它调用特定的访问例程;任何映射例程都是非常特殊的(在某种程度上),因为它提供了具有信号特定魔数(Magic Number)的(一般)映射;等等。为了获得更多乐趣,特殊 I/O 例程(以及使用的访问例程)(在所有条件下)都不可重入。所以...这些函数必须(始终)由我的模块以某种方式调用,并且在任何情况下都不得由软件的任何其他部分调用。

我怎样才能为这些函数提供一些安全性和封装性,尽管由于测试过程的原因,不可能对函数进行“静态”声明,而且我的需求文档说我的工作是确保调用的正确性。

有什么想法吗?

最佳答案

在 C 中没有办法严格定义私有(private)/公共(public)函数或变量。您可以做的就是“隐藏”一些信息或将函数或变量定义为静态

隐藏信息的一种方法是使用 header my_object.h,例如:

typedef struct my_object_struct my_object_t;

my_object_t * my_object_new(...);
void my_object_free(my_object_t * my_object);
type my_function1(my_object_t * my_object, ...)
type my_function2(my_object_t * my_object, ...)

以及文件my_object.c中的实现:

struct my_object_struct{
type some_var
type some_var2
...
};

struct some_hidden_state{
...
};

type __my_hidden_function(my_object_t * my_object, struct some_hidden_state * state, ...){

}

my_object_t * my_object_new(...){
...
}

void my_object_free(my_object_t * my_object){
...
}

type my_function1(my_object_t * my_object, ...){
...
}

type my_function2(my_object_t * my_object, ...){
...
}

创建 my_object_t 对象的唯一可见方法是使用 my_object_new,并且其内部变量将被隐藏(但对于调试器来说不是)。

这样 my_hidden_​​functionmy_hidden_​​state 不可见,但有人仍然可以使用 extern 关键字和正确的原型(prototype)来使用它们;严格封装它们的唯一方法是使用static

关于c - 如何控制对无法设为私有(private)的公共(public) C 函数的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015057/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com