返回指向 C 中全局静态结构对象的指针

moh*_*qub 0 c static struct

typedef struct
{
   int age;
   int number;
} person;

static person self;//global declaration 

person *Self(){
    return &self;
}
Run Code Online (Sandbox Code Playgroud)

我一直在尝试理解上面的类似代码,该代码在大型代码库中使用,任何帮助将不胜感激。

  1. 为什么我们需要像上面这样的Self()C 函数?
  2. 有什么好处?
  3. 有什么缺点吗?

Lun*_*din 5

这个特定的片段没有多大意义。

static可以用作“穷人的私有封装”,如果一个对象保证是“单例”——也就是说,只有一个实例存在并且不能被多个线程访问。

在这种情况下,变量的范围缩小到本地.c文件static。并Self充当“吸气剂”功能。(作为多线程环境中的单例,您可以将互斥体/信号量放置在 setter/getter 函数中,这样这将是它们的另一种用途。)

然而,虽然这样的设计在某些情况下可能有意义,但返回const指向私有变量的非限定符指针与跳过私有封装并使用全局/文件范围变量一样糟糕的设计。

根据以上内容回答您的问题:

  1. 为什么我们需要像上面的 C 语言中的 Self() 函数这样的函数?

如果它返回一个const合格的指针,那么它作为一个 getter 函数就有意义了。就目前而言,它只是臃肿且糟糕的设计。

  1. 有什么好处?
  2. 有什么缺点吗?

就代码而言,没有好处,只有缺点。这看起来像是一次拙劣的实现私有封装的尝试。


为了在 C 中进行正确的多实例私有封装,您不会使用static所谓的“不透明类型”。下面是一个例子:How to do private encapsulation in C?