Maison >développement back-end >C++ >Comment puis-je déclarer de manière concise des chaînes au moment de la compilation en C ?

Comment puis-je déclarer de manière concise des chaînes au moment de la compilation en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-10 02:24:101058parcourir

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

Déclaration de chaînes au moment de la compilation Concisley en C

Introduction
En C, déclaration de chaînes au moment de la compilation , qui restent constants tout au long de la compilation, peuvent s'avérer fastidieux. Les approches traditionnelles nécessitent de spécifier une séquence variadique de caractères :

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

Approches existantes : défis et limites
Idéalement, déclarer des chaînes au moment de la compilation devrait être plus simple, comme :

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

Cependant, ces approches se heurtent obstacles :

  • L'approche 1 nécessite un tableau avec des liens externes et une implémentation complexe.
  • L'approche 2, utilisant des littéraux définis par l'utilisateur, est difficile en raison de la nature non contextuelle de l'entrée paramètre.
  • Les fonctions Constexpr ne peuvent pas accepter les tableaux non-constexpr comme paramètres.

Solution : bibliothèque str_const
Dès la présentation de Scott Schurr à C Now 2012, la bibliothèque str_const offre une solution pratique :

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

Cette solution offre des avantages tels que la vérification de la plage constexpr et la récupération flexible des sous-chaînes, sans avoir besoin de macros.

Mise à jour : C 17 et std::string_view
En C 17, std::string_view propose une solution similaire :

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

Cette approche offre les avantages suivants :

  • Pas besoin de bibliothèques personnalisées ou macros.
  • Vérification de plage à l'aide de .at() ou .substr().
  • Peut être utilisé comme type de paramètre const.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn