将c中的变量声明为全局变量或封装它们并使用getter和setter

1 c encapsulation scope linkage

我已经开始用C编程了,总的来说我正在寻找构建代码的"最佳实践".

之前主要使用面向对象的语言,我开始采用这些语言的一些实践.

我的具体问题是:这段代码被认为是"可接受的"C代码,还是我遇到了试图在C中使用封装的人遇到的常见陷阱?

// A.h 
void setValue(int);
int getValue();

// A.c 
#include "A.h"

int my_private_value;

void setValue(int v)
{   
  my_private_value = v;
}   

int getValue(void)
{   
  return my_private_value;
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 6

要迂腐:C中没有全局变量.变量具有范围,存储持续时间和链接.对于这些都没有"全球"资格.

那么接下来发生了什么?您的

int my_private_value;
Run Code Online (Sandbox Code Playgroud)

是一个带有文件范围外部链接(以及静态存储持续时间)的变量.这种类型的链接意味着它可以从具有extern int my_private_value范围声明的任何其他文件中引用.为避免这种情况,变量必须具有内部链接.要声明具有内部链接的变量,请使用以下static关键字:

static int my_private_value;
Run Code Online (Sandbox Code Playgroud)

所以,如果你想听起来像专业人士,每当你想要说出"全局变量"时,深呼吸并用文件范围和外部链接说出单词对象.那会让你在所有C面试中大放异彩:-)

如果有人质疑你缺乏"全局"变量的智慧,你甚至可以向他们证明这一点.全局变量到处都是,对吧?但在C语言中,对象的范围在其声明之前就开始了.缺少真正的全局变量使得无法转发引用变量

 int *foo = &bar;   /* Doesn't work in C: bar is not (yet) in scope. */
 int bar = 42;
Run Code Online (Sandbox Code Playgroud)

当你交换两条线时,它确实有效.