C でコンパイル時文字列を簡単に宣言
コンパイル時に文字列を作成および操作することは、C で便利なツールです。ただし、コンパイル時文字列を宣言する現在のプロセスは煩雑であり、文字の可変引数シーケンスを使用する必要があります。ここで疑問が生じます: C でコンパイル時文字列を宣言するもっと便利な方法はありますか?
既存のアプローチとその制限
理想的には、次のように宣言したいと思います。
using str1 = sequence<"Hello, world!">;
のような構文を使用したコンパイル時文字列。あるいは、次のように使用することもできます。ユーザー定義リテラル:
constexpr auto str2 = "Hello, world!"_s;
ただし、宣言された型の str2 には constexpr コンストラクターが欠如しており、ユーザー定義リテラルのアプローチはポインターからメンバーへの複雑さのため実現できません。さらに、これを実現するために constexpr 関数を使用しようとすると、配列または文字列パラメータが constexpr 型ではないという問題が発生します。
提案された解決策と現在のステータス
便利なコンパイル時の文字列宣言の問題に具体的に対処する現在の提案や言語機能はありませんが、Scott Schurr が C Now で str_const ユーティリティを提案しました。 2012。このユーティリティは、constexpr 機能を必要としますが、以下に示すように非常に洗練されたソリューションを提供します:
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
std の導入により: C 17 の :string_view は、str_const のより良い代替手段として利用可能です。上記のコードは次のように書き換えることができます:
#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! }
このアプローチでは、コンパイル時の文字列操作機能と範囲外チェックの両方が提供されます。
以上がC でコンパイル時文字列を宣言するもっと便利な方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。