Maison > développement back-end > C++ > Existe-t-il un moyen plus pratique de déclarer des chaînes au moment de la compilation en C ?

Existe-t-il un moyen plus pratique de déclarer des chaînes au moment de la compilation en C ?

Patricia Arquette
Libérer: 2024-12-13 06:04:13
original
540 Les gens l'ont consulté

Is There a More Convenient Way to Declare Compile-Time Strings in C  ?

Déclarer facilement des chaînes au moment de la compilation en C

Créer et manipuler des chaînes au moment de la compilation peut être un outil utile en C . Cependant, le processus actuel de déclaration des chaînes au moment de la compilation est fastidieux, nécessitant l'utilisation de séquences de caractères variadiques. Cela soulève la question : existe-t-il un moyen plus pratique de déclarer des chaînes au moment de la compilation en C ?

Approches existantes et leurs limites

Idéalement, nous aimerions déclarer chaînes au moment de la compilation avec une syntaxe telle que :

using str1 = sequence<"Hello, world!">;
Copier après la connexion

Alternativement, nous pourrions utiliser des chaînes définies par l'utilisateur littéraux :

constexpr auto str2 = "Hello, world!"_s;
Copier après la connexion

Cependant, le type déclaré de str2 n'a pas de constructeur constexpr et l'approche littérale définie par l'utilisateur n'est pas réalisable en raison de complications liées au pointeur vers le membre. De plus, tenter d'utiliser une fonction constexpr pour y parvenir se heurte au problème du paramètre tableau ou chaîne qui n'est pas un type constexpr.

Solution proposée et état actuel

Bien qu'il n'existe actuellement aucune proposition ou fonctionnalité de langage qui aborde spécifiquement le problème de la déclaration de chaîne au moment de la compilation, Scott Schurr a proposé l'utilitaire str_const lors de C Now 2012. L'utilitaire, bien que nécessitant des capacités constexpr, offre une solution très élégante, comme on le voit ci-dessous :

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!
}
Copier après la connexion

Mise à jour C 17

Avec l'introduction de std::string_view dans C 17, une meilleure alternative à str_const est disponible. Le code ci-dessus peut être réécrit comme suit :

#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!
}
Copier après la connexion

Cette approche fournit à la fois des capacités de manipulation de chaînes au moment de la compilation et des vérifications hors plage.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal