アプリ版:「スタンプのみでお礼する」機能のリリースについて

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 に相当)

になります。

A 回答 (1件)

const char * から unsigned char * への変換は


・const_cast と static_cast なり reinterpret_cast なりを組み合わせる
・「なんとか_cast」という形ではなく C タイプのキャストを使う
のどちらかでいけるはず.

配列へのキャストができれば「unsigned char * の配列を文字列リテラル (のリスト) で初期化する」こともできる, かもしれない.

どうにもならなかったら
unsigned char read[] = "read";
とかやればいけると思う. おそろしく面倒なのでやりたくないけど.
    • good
    • 1
この回答へのお礼

ありがとうございました。
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 は外せないと書いてありました)

お礼日時:2020/02/07 12:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています