video中的鲍勃·马丁(Bob Martin)说“ C具有完美的封装”。我不明白他为什么这么说...我知道我们可以将实现隔离在.c文件中,并在标头.h文件中声明接口,但是并没有什么真正阻止我访问这样的实现详细信息的:
main.c
#include <stdio.h>
#include "file1.h"
extern int x;
int main() {
printf("%d\n", x);
return 0;
}
file1.c
int x = 5;
int getnum_file1() {
return x + 1;
}
file1.h
int getnum_file1();
在这种情况下,main.c可以访问file1.c中的实现详细信息。该代码还将编译并以预期的结果执行。这种完美的封装效果如何?
答案 0 :(得分:4)
一种确保封装的方法是将x
声明为static int x = 5;
,因此从外部对象(即使使用extern
)也看不到它。
很显然,可以从另一个对象(通过链接器,通过添加的x
)访问全局变量extern
。但是,这通常会导致“意大利面条”代码,其中由于没有适当的封装(而C或C ++确实提供了避免这种情况的有用方法),因此可以从任何地方访问和/或修改变量。