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)
要迂腐: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)
当你交换两条线时,它确实有效.