首頁 >後端開發 >C++ >如何在 C 中簡潔地聲明編譯時字串?

如何在 C 中簡潔地聲明編譯時字串?

Barbara Streisand
Barbara Streisand原創
2024-12-10 02:24:101020瀏覽

How Can I Concisely Declare Compile-Time Strings in C  ?

在C 中宣告編譯時字串

簡介
在C 中,宣告編譯時字元串,在整個編譯過程中保持不變,可能會很麻煩。傳統方法需要指定可變字元序列:

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;

現有方法:挑戰與限制
理想情況下,聲明編譯時字串應該更簡單,例如:

using str1 = sequence<"Hello, world!">;
constexpr auto str2 = "Hello, world!"_s;

然而,這些方法面臨障礙:

  • 方法 1需要具有外部連結和複雜實現的陣列。
  • 方法 2 使用使用者定義的文字,由於輸入的非 constexpr 性質而具有挑戰性參數。
  • Constexpr 函數不能接受非 constexpr 數組,因為

解:str_const 函式庫
Scott Schurr 在 C Now 2012 上的演講中,strid函式庫提供了一個方便的解決方案:

constexpr str_const my_string = "Hello, world!";
static_assert(my_string.size() == 13);
static_assert(my_string[4] == 'o');
constexpr str_const world(my_string, 7, 5);
static_assert(world == "world");

該解決方案提供了constexpr 範圍檢查和靈活的子字串檢索等優點,而無需

更新:C 17 和std::string_view
在C 17 中,std::string_view提供了類似的解決方案:

constexpr std::string_view my_string = "Hello, world!";
static_assert(my_string.size() == 13);
static_assert(my_string[4] == 'o');
constexpr std::string_view world(my_string.substr(7, 5));
static_assert(world == "world");

這種方法提供以下優點:

  • 無需自訂程式庫或巨集。
  • 使用 .at() 或 .substr() 進行範圍檢查。
  • 可以用作 const 參數型別。

以上是如何在 C 中簡潔地聲明編譯時字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn