
C++17で、unsigned char * 配列を、文字列リテラルで初期化する方法はありませんか?
例えば、
unsigned char *comList[] = {"read", "write", "erase", 0};
のような初期化はできないでしょうか?
文字列リテラルの型が、const char 配列なので、unsigned char * のリストの初期化は
cannot initialize an array element of type 'unsigned char *' with an lvalue of type 'const char [4]'
とはじかれます。
ではと思っても、unsigned char * と char * は、stati_cast も reinterpret_cast もアウトでした。
実は、外部との通信関数にコマンドを渡したくて、それをリストにしようとしたのですが、通信関数の引数が、
unsigned char * になっていて、困っています。
(古い関数、こちらの修正はしたくないという事情があります)
なにか、
・unsigned char * の配列を、文字列リテラルで初期化する
・const char * 型のデータを、unsigned char * に渡す
方法はないでしょうか?
処理系はC++ Builder 10.3.3 で、コンパイラ自体のバージョンは、
Embarcadero C++ 7.40 for Win32 Copyright (c) 2012-2018 Embarcadero Technologies, Inc.
Embarcadero Technologies Inc. bcc32c version 5.0.2 (36933.9854b07.fc1c373) (based on LLVM 5.0.2)
(Clang 5.0 に相当)
になります。
No.1ベストアンサー
- 回答日時:
const char * から unsigned char * への変換は
・const_cast と static_cast なり reinterpret_cast なりを組み合わせる
・「なんとか_cast」という形ではなく C タイプのキャストを使う
のどちらかでいけるはず.
配列へのキャストができれば「unsigned char * の配列を文字列リテラル (のリスト) で初期化する」こともできる, かもしれない.
どうにもならなかったら
unsigned char read[] = "read";
とかやればいけると思う. おそろしく面倒なのでやりたくないけど.
ありがとうございました。
Cスタイルのキャストで乗り切ることができました。
ただ、ちょっと考えて
const char *comList[] = {"read", "write", "erase", 0};
は、素直に、const char* の配列にして、
外部の関数を呼び指す際に、
send((unsigned char *)comList[i]);
としました。
あと、確かに、
send(reinterpret_cast<unsigned char*>(const_cast<char *>(comList[i])) );
でも、可能でした。
Cスタイルのキャストが紛れ込むのはあまり面白くはないですが、かといって、 C++キャスト2段重ねも、うっとうしい気はします。
もともと、reinterpret_cast は、世界最強のキャストだと思っていたので、 reinterpret_cast が失敗して、CスタイルキャストがOKというのは、意外な気がしました。
(と思ったら、確かに、reinterpret_cast では const は外せないと書いてありました)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
isalpha()関数について
-
CStringからchar*への型変換に...
-
文字列strの中から文字cを探す...
-
警告
-
C言語でポインターで詰まってい...
-
文字列の途中から途中までを抽出
-
エクセルのMID関数は、C言語では?
-
文字列を比較するプログラムな...
-
ビット演算のやり方
-
new charとnew char[N]の違いは?
-
文字列内の数字削除
-
C++Builder 2009 テキスト...
-
動的メモリの初期化方法について。
-
小数点入りの文字列をfloat型に...
-
以下のようなプログラムを書い...
-
構造体・ビットフィールドのvol...
-
メモリを0クリアする方法について
-
char*を初期化したいのですが
-
VBからCで作成されたDLL...
-
構造体のメンバーの静的なサイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
char型にint型の数値を代入する。
-
char 文字列型 の表現範囲が-12...
-
文字列を比較するプログラムな...
-
ostringstreamではまりました
-
文字列内の数字削除
-
C言語のプログラムについてです
-
csvファイルをfscanfで読み込む...
-
エクセルのMID関数は、C言語では?
-
ポインタを使って回文かどうか...
-
C言語でポインターで詰まってい...
-
文字列の途中から途中までを抽出
-
new charとnew char[N]の違いは?
-
文字列str内の全ての数字を...
-
以下のようなプログラムを書い...
-
char AA[]{"全角文字"};から"全...
おすすめ情報