Kompilierungszeit-Strings bequem in C deklarieren
Das Erstellen und Bearbeiten von Strings während der Kompilierungszeit kann in C ein nützliches Werkzeug sein. Der derzeitige Prozess der Deklaration von Zeichenfolgen zur Kompilierungszeit ist jedoch umständlich und erfordert die Verwendung verschiedener Zeichenfolgen. Dies wirft die Frage auf: Gibt es eine bequemere Möglichkeit, Zeichenfolgen zur Kompilierungszeit in C zu deklarieren?
Bestehende Ansätze und ihre Einschränkungen
Im Idealfall möchten wir deklarieren Zeichenfolgen zur Kompilierungszeit mit einer Syntax wie:
using str1 = sequence<"Hello, world!">;
Alternativ könnten wir benutzerdefiniert verwenden Literale:
constexpr auto str2 = "Hello, world!"_s;
Dem deklarierten Typ von str2 fehlt jedoch ein constexpr-Konstruktor, und der benutzerdefinierte Literal-Ansatz ist aufgrund von Zeiger-zu-Member-Komplikationen nicht möglich. Darüber hinaus stößt der Versuch, dies mithilfe einer constexpr-Funktion zu erreichen, auf das Problem, dass der Array- oder String-Parameter kein constexpr-Typ ist.
Vorgeschlagene Lösung und aktueller Status
Während es derzeit keinen Vorschlag oder keine Sprachfunktion gibt, die sich speziell mit der Frage einer bequemen String-Deklaration zur Kompilierzeit befasst, hat Scott Schurr auf der C Now 2012 das Dienstprogramm str_const vorgeschlagen Obwohl das Dienstprogramm constexpr-Funktionen erfordert, bietet es eine sehr elegante Lösung, wie unten gezeigt:
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! }
C 17-Update
Mit der Einführung von std::string_view in C 17 ist eine bessere Alternative zu str_const verfügbar. Der obige Code kann wie folgt umgeschrieben werden:
#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! }
Dieser Ansatz bietet sowohl String-Manipulationsfunktionen zur Kompilierungszeit als auch Überprüfungen außerhalb des Bereichs.
Das obige ist der detaillierte Inhalt vonGibt es eine bequemere Möglichkeit, Zeichenfolgen zur Kompilierzeit in C zu deklarieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!