私は最初に「正しく」何であるかを決定すると言います。真剣に。
入力を最も正確にしますか?関数が失敗しないようにしますか?入力できるものの値を制限しますか?作成するものの要件を検討することをお勧めします。
この関数が呼び出された時点で、データはどの形式になっていますか?ユーザーが「YYYYMMDDHH MM SS」と入力した文字列に含まれている可能性があります。その場合は、1つの文字列を取得して、自分で値を解析するのが最も賢明です。もちろん、それはあなたの関数内でもっと多くの仕事です。
また、自分で関数を作成している場合は、何が期待されるかをおそらく知っているので、入力値とテストについてより寛大になる可能性があります。何十万人もの人々がそれらのAPIを使用するオペレーティングシステム用の関数を作成している場合は、許可されているものをより明確にし、関数内でそれらをテストする必要があります。
状況に最も「正しい」ものに応じて、参照する単純な関数でさえ指定する方法がいくつかあります。
bool MyObject_SetLocalDateTime(pMyObject、int YYYY、unsigned int MM、unsigned int DD、int HH、int MM、int SS); //戻り値は成功または失敗を示します。
しかし、消費者がMMにゼロを渡した場合はどうなるでしょうか。消費者が13を通過した場合はどうなりますか?月を参照する数値(jan-dec)には、base-0(通常はCが使用するもの)または通常の1-12を使用しますか?これは、人間の月の観点からはより理にかなっていますが、 Cプログラマーの考え方は?
日付と時刻のようなものについては、Cライブラリにこれの定義があります。これにより簡単になります。また、Cライブラリはすでにそのように実行しているため、関数を使用している他のユーザーにとってはより自然に見えるかもしれません。
また、「誤って使用するのが難しい」とはどういう意味かを定義する必要があります。繰り返しますが、私は真剣です。たぶん、月(および日)の列挙型を作成し、intの代わりにそれを渡したいと思うでしょう。これにより、コンパイラによるAPIの追加の型チェックが可能になりますが、APIの巧妙なコンシューマーが別の値にキャストする可能性があるため、有効な入力のテストをスキップできるとは思わないでください。
関数内では、渡された形式に関係なく、入力値を検証して、それらが有効であることを確認し、2月に30日を許可せず、2月に29日を許可することを確認します。たった4年ごと。日付と時刻には多くの隠れた複雑さがあり、OSですでに開発されているルーチンまたはランタイムライブラリに依存するのが賢明です。