Kompilasi Rentetan Rentetan Masa Menggunakan C 11 Rentetan Literal
Soalan:
Adakah mungkin untuk mengira cincang rentetan pada masa penyusunan menggunakan rentetan baharu C 11 literals?
Jawapan:
Ya, ia mungkin, tetapi memerlukan berhati-hati, kerana ia mungkin tidak berfungsi dengan semua penyusun.
Operator:
Operator untuk pencincangan rentetan masa kompilasi tidak ditakrifkan secara eksplisit. Sebaliknya, ungkapan malar dijana menggunakan fungsi cincang masa kompilasi yang mengambil rentetan literal sebagai input.
Kes Penggunaan:
Satu kes penggunaan yang berpotensi adalah untuk mencipta pernyataan suis yang boleh melakukan tindakan berbeza berdasarkan cincang rentetan:
void foo(const std::string& value) { switch(std::hash<value>()) { case "one"_hash: one(); break; case "two"_hash: two(); break; default: other(); break; } }
Contoh Pelaksanaan:
Berikut ialah contoh pelaksanaan menggunakan fungsi constexpr:
template<size_t idx> constexpr uint32_t crc32(const char * str) { // Compile-time CRC32 implementation return (crc32<idx-1>(str) >> 8) ^ crc_table[(crc32<idx-1>(str) ^ str[idx]) & 0x000000FF]; } template<> constexpr uint32_t crc32<size_t(-1)>(const char * str) { // Stop recursion return 0xFFFFFFFF; } #define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)
Fungsi ini boleh digunakan seperti berikut:
enum TestEnum { CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"), };
Dalam contoh ini , CrcVal01 akan dinilai kepada cincang masa kompilasi rentetan "timbunan-limpahan."
Atas ialah kandungan terperinci Bolehkah C 11 String Literals Digunakan untuk Compile-Time String Hashing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!