これはC ++では不可能かもしれませんが、理由はわかりません。スタックオーバーフローとグーグルを検索してきましたが、答えが見つかりません。
最初に、私が取り組んでいる仮定について述べます。
最初の仮定:このコードがグローバルスコープにある場合。プログラムのデータセグメントに格納されると思います。つまり、コンパイル時にメモリアドレスがわかっているということです。char const* const test1 = "test1";
2番目の仮定:列挙値はシンボルテーブルにシンボルとして格納されます。
このコードはコンパイルされます:
enum class test : size_t
{
TEST0 = 123,
TEST1 = 456
};
ただし、size_tが32ビットマシンでは32ビット、64ビットマシンでは64ビットであることを考えると、ポインタのアドレスを格納できるはずです。ただし、これはコンパイルされません。
char const* const test1 = "test1";
enum class test : size_t
{
TEST0 = 123,
TEST1 = (size_t)test1
};
なぜこれが機能しないのですか?test1のアドレスはコンパイル時に認識されている必要があり、単にメモリアドレスを保存している必要があります。
これを行う目的は、アドレスをポインターに変換し直し、それを使用して列挙型を文字配列(つまり、文字列)に変換できるようにすることです。
test1
のアドレスはコンパイル時に不明であり(アドレス空間配置のランダム化などが影響します)、コンパイル中は確実に不明です(変数はリンクするまでデータセグメントに一緒に配置されないため)。
あなたの質問は本当にXY問題のように聞こえます。ユニークなものがたくさんある場合char*
、なぜそれらを列挙型に詰め込むのですか?それらはすでに列挙型を表しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加