Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengisytiharkan Rentetan Masa Kompilasi dengan Ringkas dalam C ?

Bagaimanakah Saya Boleh Mengisytiharkan Rentetan Masa Kompilasi dengan Ringkas dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-12-10 02:24:101019semak imbas

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

Mengisytiharkan Rentetan Masa Kompilasi Concisley dalam C

Pengenalan
Dalam C , mengisytiharkan rentetan masa kompilasi , yang kekal malar sepanjang penyusunan, boleh menyusahkan. Pendekatan tradisional memerlukan penentuan urutan aksara yang variadik:

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

Pendekatan Sedia Ada: Cabaran dan Had
Sebaik-baiknya, mengisytiharkan rentetan masa kompilasi hendaklah lebih mudah, seperti:

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

Walau bagaimanapun, pendekatan ini dihadapi halangan:

  • Pendekatan 1 memerlukan tatasusunan dengan kaitan luaran dan pelaksanaan yang kompleks.
  • Pendekatan 2, menggunakan literal yang ditakrifkan pengguna, adalah mencabar kerana sifat input bukan konteks parameter.
  • Fungsi Constexpr tidak boleh menerima tatasusunan bukan constexpr sebagai parameter.

Penyelesaian: str_const Library
Sehingga pembentangan Scott Schurr di C Now 2012, perpustakaan str_const menawarkan penyelesaian yang mudah:

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");

Penyelesaian ini memberikan faedah seperti pemeriksaan julat constexpr dan pengambilan subrentetan yang fleksibel, tanpa memerlukan makro.

Kemas kini: C 17 dan std::string_view
Dalam C 17, std::string_view menawarkan penyelesaian yang serupa:

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");

Pendekatan ini memberikan kelebihan berikut:

  • Tidak memerlukan perpustakaan tersuai atau makro.
  • Semakan julat menggunakan .at() atau .substr().
  • Boleh digunakan sebagai jenis parameter const.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengisytiharkan Rentetan Masa Kompilasi dengan Ringkas dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn