我首先要说决定什么是“正确”。严重地。
您希望输入是最准确的吗?您希望该功能不会失败吗?你想限制可以输入的值吗?您可能需要考虑您正在创建的内容的要求。
如果此时调用此函数,数据的格式是什么?它可能只是在用户输入的“YYYY MM DD HH MM SS”的字符串中,那么采用一个字符串并自己解析出值可能是最明智的。当然,这在你的函数中还有很多工作要做。
此外,如果您是为自己编写函数,您可以对输入值和测试更加宽容,因为您可能知道预期的内容。如果您正在为一个将有数十万人使用这些 API 的操作系统创建一个函数,那么您需要更明确地说明允许的内容并在您的函数中测试它们。
根据您的情况最“正确”的情况,有多种方法可以指定您引用的简单函数。
bool MyObject_SetLocalDateTime(pMyObject, int YYYY, unsigned int MM, unsigned int DD, int HH, int MM, int SS); // 返回值表示成功或失败。
但是,如果消费者为 MM 传入零怎么办?如果消费者在 13 中通过怎么办?您是使用 base-0(通常是 C 使用的)还是常规的 1-12 来表示月份(jan-dec)的数字,从人类月份的角度来看,这更有意义,但有点奇怪C程序员的思维方式?
对于日期和时间之类的内容,C 库对此进行了定义,这将使您更容易。此外,由于 C 库已经这样做了,因此对于使用您的函数的其他用户来说,它可能看起来更自然。
您还需要定义“难以正确使用”的含义。再说一次,我是认真的。也许您想为月份(和几天)创建一个枚举,并将其传递给 int。这将使编译器对 API 进行额外的类型检查,但你的 API 的聪明消费者可能会转换为另一个值,所以不要认为你可以跳过对有效输入的测试。
在您的函数中,您需要验证输入值,无论它们以何种形式传递,以确保它们有效,检查您不允许 2 月的 30 天,并且您允许 2 月的 29 天,但是仅每四年一次。日期和时间有很多隐藏的复杂性,因此明智地依赖已经在操作系统中开发的例程或运行时库。