在編譯時計算 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 節),常數表達式「可以在翻譯過程中求值」。然而,這只是一個非規範的註釋,而不是堅定的保證。
為了確保編譯時評估,我們可以利用兩種策略:
因此,雖然標準沒有明確要求在編譯時計算length 函數,但我們可以透過將其用作常數表達式或初始化constexpr 變數來強制執行此類計算。這種做法開啟了在編譯期間對字串文字執行複雜計算的可能性,例如計算雜湊值或執行複雜的字串操作。
以上是C 中的遞歸字串長度函數的計算是否能在編譯時得到保證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!