Heim > Backend-Entwicklung > C++ > Wie kann ich Kompilierungszeitzeichenfolgen in C präzise deklarieren?

Wie kann ich Kompilierungszeitzeichenfolgen in C präzise deklarieren?

Barbara Streisand
Freigeben: 2024-12-10 02:24:10
Original
1022 Leute haben es durchsucht

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

Deklarieren von Zeichenfolgen zur Kompilierzeit Concisley in C

Einführung
In C Deklarieren von Zeichenfolgen zur Kompilierzeit , die während der Kompilierung konstant bleiben, können sich als umständlich erweisen. Herkömmliche Ansätze erfordern die Angabe einer verschiedenen Zeichenfolge:

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

Bestehende Ansätze: Herausforderungen und Einschränkungen
Idealerweise sollte die Deklaration von Zeichenfolgen zur Kompilierungszeit einfacher sein, wie zum Beispiel:

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

Diese Ansätze stehen jedoch im Widerspruch Hindernisse:

  • Ansatz 1 erfordert ein Array mit externer Verknüpfung und komplexer Implementierung.
  • Ansatz 2, der benutzerdefinierte Literale verwendet, ist aufgrund der nicht-konstruktiven Natur der Eingabe eine Herausforderung Parameter.
  • Constexpr-Funktionen können keine Nicht-Constexpr-Arrays als akzeptieren Parameter.

Lösung: str_const-Bibliothek
Seit Scott Schurrs Präsentation auf der C Now 2012 bietet die str_const-Bibliothek eine praktische Lösung:

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");
Nach dem Login kopieren

Diese Lösung bietet Vorteile wie constexpr-Bereichsprüfung und flexibles Abrufen von Teilzeichenfolgen, ohne dass dies erforderlich ist Makros.

Update: C 17 und std::string_view
In C 17 bietet std::string_view eine ähnliche Lösung:

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");
Nach dem Login kopieren

Dieser Ansatz bietet die folgenden Vorteile:

  • Keine Notwendigkeit für benutzerdefinierte Bibliotheken oder Makros.
  • Bereichsprüfung mit .at() oder .substr().
  • Kann als konstanter Parametertyp verwendet werden.

Das obige ist der detaillierte Inhalt vonWie kann ich Kompilierungszeitzeichenfolgen in C präzise deklarieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage