我正在使用C库中的一个函数,该函数将一个数字作为参数。目前,这意味着我有两个版本,一个用于double
,另一个用于int
。
我应该为数字类型提供哪些版本的函数?
通常在标准库中看到这一点,但它们不够一致,无法使用指南,例如atof
,atol
和atoi
是一套,strtod
,strtol
,strtoul
是不同的集合abs
, labs
是第三个。这是三个不同的集合,不同的命名方案都在同一个头文件中。
编辑:
这不是一次性使用,我不知道需要哪些变体。
理想情况下它会支持每一个标准变体,所以用strto*
函数的样式编写三个并让用户在需要的地方提升类型就足够了吗?
答案 0 :(得分:3)
您是否需要更多功能变体?
我怀疑,鉴于需要提出这个问题,您只需要double
和int
这两个函数。例如,如果您真的需要支持double complex
,请构建一个专门的函数来处理它。
答案 1 :(得分:1)
要回答这个问题,我认为我们需要了解更多有关相关功能的内容。作为一般规则,我最多只提供一个浮点和一个整数版本,除非它对于获得处理较小类型的好处的性能至关重要。 int
是一个非常糟糕的选择。我会使用long
,long long
,intmax_t
或uintmax_t
,具体取决于您是否要支持C89,您在项目中使用类型的约定以及签名要求。或者,您可以创建自己的类型mylib_intarg
,以便更改使用的基础类型,但为了理智,请 不要鼓励您的用户库用这些丑陋的类型声明变量。相反,只需将它们作为函数的参数类型,以便调用者使用任何自然的变量类型。
答案 2 :(得分:1)
将其实现为C ++函数模板并添加一个C包装器,这样当您需要支持说long long
或long double
时,只需添加另一个C包装器,您的C ++算法模板就会保持原样并且您不会不需要记住细节。