我注意到,在许多库中,版本信息以及关于特殊功能可用性的信息(可能因构建而异或不可用)可供客户端应用程序访问,这些信息不是通过常量,而是通过返回常量的函数调用来访问,例如:
const char *libversion(void) {
return "0.2";
}
bool support_ssl(void) {
return LIB_SSL_ENABLED; /* whatever */
}
而不是简单地:
const char *libversion = "0.2";
bool support_ssl = LIB_SSL_ENABLED;
这样做是有实际的原因,还是只是某种惯例?
最佳答案
这样做是有实际的原因,还是只是某种惯例?
我想说两个…
我看到这样做的一个实际原因是,当您分发库时,您的用户将其编译版本安装为共享对象,并使用头访问其数据。如果常量可以通过函数访问,则在头中声明其原型,但在编译单元中定义该值,并链接到共享对象文件中。编辑:我不是说这是不可能的,但是这样做的一个很好的理由是保持API稳定的可能性,同时将给定函数从常量值切换到计算值,cf reason#3。
我看到的另一个实际原因是,您可以使用某种“中间件”来访问该API,比如corba,它使您能够访问函数,但不能访问常量(如果我在这一点上错了,请原谅我,我已经10年没有做过corba了……)。
最后,它还是一个很好的OOP约定,头文件是一个纯功能接口,所有成员都被封装起来,实现了库内部工作和公开行为的完全分离。