公开函数而不是常量来描述库特征

时间:2014-05-11 00:59:42

标签: c api

我注意到在很多库中,版本信息以及有关特殊功能可用性的信息(可能因构建而不同或不存在)都可供客户端应用程序访问,而不是通过常量,但是通过函数调用返回一个常量,例如:

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;

是否有实际的理由这样做,还是只是某种惯例?

1 个答案:

答案 0 :(得分:1)

  

是否有实际的理由这样做,还是只是某种约定?

我会说两个......

我看到的一个实际原因是,当您分发库时,您的用户将其编译版本作为共享对象安装,并使用标头访问其数据。如果常量可通过函数访问,则其原型在头中声明,但该值在编译单元中定义,在共享对象文件中链接。编辑:我不是说它不可能,但这样做的一个很好的理由是保持API保持稳定的可能性,同时从给定函数的常量值切换到计算值,参见原因#3。 / p>

我可以看到的另一个实际原因是你可以使用某种“中间件”访问该API,比如corba,它可以让你访问函数,但不能访问常量(如果我错了,请与我好心相处)特别是,10年来我没有做任何CORBA ......)。

最后,它在某种程度上是好的OOP约定,头文件是一个纯函数接口,并且所有被封装的成员都能够完全解耦库的内部工作和暴露的行为。