最近、コード内でリテラルを使用すべきではないとプログラマーが信じている場合があると聞いたことがあります。場合によっては、特定の番号に変数名を割り当てることが役立つ場合があることを理解しています (特に、その番号が他の場所で使用されている場合のメンテナンスの観点から)。ただし、次のケース スタディを検討してください。
ケース スタディ 1: 「特別な」バイト コードに対するリテラルの使用。
(引数のために) a に格納されている特定の値をチェックする if ステートメントがあるとしますuint16_t
。2 つのコード サンプルを次に示します。
バージョン 1:
// Descriptive comment as to why I'm using 0xBEEF goes here
if (my_var == 0xBEEF) {
//do something
}
バージョン 2:
const uint16_t kSuperDescriptiveVarName = 0xBEEF;
if (my_var == kSuperDescriptiveVarName) {
// do something
}
適切なコーディングの実践という点で「推奨される」方法はどれですか? kSuperDescriptiveVarName
が複数回使用されている場合にバージョン 2 を好む理由は十分に理解できます。また、コンパイラは、両方のバージョンを実質的に同じ実行可能コードにするために最適化を行いますか? つまり、パフォーマンスへの影響はありますか?
ケーススタディ 2: の使用sizeof
移植性と読みやすさの観点から、生のリテラルではなく sizeof を使用することが望ましいことを十分に理解しています。2 つのコード例を考慮してください。シナリオは、パケットuint8_t
の最初の部分が として格納されているパケット バッファ ( の配列)へのオフセットを計算しているmy_packet_header
ことですuint32_t
。
バージョン 1:
const int offset = sizeof(my_packet_header);
バージョン 2:
const int offset = 4; // good comment telling reader where 4 came from
明らかにバージョン 1 が優先されますが、スキップするデータ フィールドが複数ある場合はどうでしょうか。代わりに次のような場合:
バージョン 1:
const int offset = sizeof(my_packet_header) + sizeof(data_field1) + sizeof(data_field2) + ... + sizeof(data_fieldn);
バージョン 2:
const int offset = 47;
この場合、どちらが優先されますか? オフセットの計算に関連するすべてのステップを示すことはまだ意味がありますか、それともここで文字通りの使用法は意味がありますか?
コードの実践を改善しようとしているので、事前に助けてくれてありがとう。