在C 中方便地宣告編譯時字串
在編譯時建立和操作字串可能是C 中的一個有用工具。然而,當前聲明編譯時字串的過程很麻煩,需要使用可變的字元序列。這就引出了一個問題:是否有更方便的方法來在 C 中聲明編譯時字串?
現有方法及其限制
理想情況下,我們希望聲明編譯時字串的語法如下:
using str1 = sequence<"Hello, world!">;
或者,我們可以使用使用者定義的文字:
constexpr auto str2 = "Hello, world!"_s;
但是,str2 的聲明類型缺少constexpr建構函數,由於指向成員的指標複雜性,使用者定義的文字方法不可行。此外,嘗試使用 constexpr 函數來實現此目的會遇到陣列或字串參數不是 constexpr 類型的問題。
建議的解決方案和當前狀態
雖然當前沒有專門解決方便的編譯時字符串聲明問題的提案或語言功能,但Scott Schurr 在C Now上提出了str_const 實用程式2012。這個實用程式雖然需要constexpr 功能,但提供了一個非常優雅的解決方案,如下所示:
int main() { constexpr str_const my_string = "Hello, world!"; static_assert(my_string.size() == 13); static_assert(my_string[4] == 'o'); constexpr str_const my_other_string = my_string; static_assert(my_string == my_other_string); constexpr str_const world(my_string.substr(7, 5)); static_assert(world == "world"); // constexpr char x = world[5]; // Does not compile because index is out of range! }
C 17 更新
隨著std 的引入: :C 17 中的string_view,可以使用str_const 的更好替代方案。上面的程式碼可以重寫如下:
#include <string_view> int main() { constexpr std::string_view my_string = "Hello, world!"; static_assert(my_string.size() == 13); static_assert(my_string[4] == 'o'); constexpr std::string_view my_other_string = my_string; static_assert(my_string == my_other_string); constexpr std::string_view world(my_string.substr(7, 5)); static_assert(world == "world"); // constexpr char x = world.at(5); // Does not compile because index is out of range! }
這個方法提供了編譯時字串操作功能和超出範圍的檢查。
以上是有沒有更方便的方法在 C 中宣告編譯時字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!