コンパイル時の C 文字列の長さの計算
C では、コンパイル中に文字列リテラルの計算を実行できます。次のコード スニペットを考えてみましょう:
<code class="c++">#include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); }</code>
このコードは、再帰関数を利用して、コンパイル時に指定された文字列リテラルの長さを決定します。結果を出力することで、関数が文字列の長さ (つまり 4 と 8) を正しく計算していることを確認できます。結果として得られるアセンブリ コードは、これらの計算がコンパイル中に実行されることも示しています。
ただし、次の重要な疑問が残ります。この長さ関数の評価は、C 標準に従ってコンパイル時に行われることが保証されていますか?
答えは、予想されるほど単純ではありません。ドラフト C 標準 (セクション 5.19) によれば、定数式は「翻訳中に評価できる」とされています。ただし、これは単なる非規範的な注意事項であり、確実な保証ではありません。
コンパイル時の評価を確実にするために、次の 2 つの戦略を利用できます。
したがって、標準ではコンパイル時に長さ関数を評価することを明示的に義務付けていませんが、定数式として利用するか、constexpr 変数を初期化することで、そのような評価を強制することができます。この実践により、コンパイル中に文字列リテラルに対してハッシュの計算や複雑な文字列操作の実行など、高度な計算を実行できる可能性が広がります。
以上が再帰的な文字列長関数の評価は、C のコンパイル時に保証されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。