web-dev-qa-db-ja.com

「const char *」から「unsigned char *」への無効な変換

簡単なC++コード:

int main(){
unsigned char* t="123";
}

g ++でコンパイルすると、次のエラーが発生します。

invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]

どうして?

12
anupamD

C++では、文字列リテラルには定数文字配列のタイプがあります。たとえば、文字列リテラル"123"の型はconst char[4]です。

まれな例外を含む式では、配列は最初の要素へのポインターに変換されます。

したがって、この宣言では

unsigned char* t="123";

初期化子のタイプはconst char *です。 const char *からunsigned char *への暗黙的な変換はありません

あなたは書くことができます

const unsigned char* t = reinterpret_cast<const unsigned char *>( "123" );
24

最初に望んでいた変更可能なunsigned char配列を取得する別のアプローチは次のとおりです。

#include <cstdlib>
#include <iostream>

using std::cout;
using std::endl;

int main()
{
    unsigned char ta[] = "123";
    unsigned char* t = ta;

    cout << t << endl;  // Or ta.

    return EXIT_SUCCESS;
}

必要に応じて、両方の宣言にconstを追加して、明示的なキャストなしでconst unsigned charを取得できます。

3
Davislor

自己定義マクロを使用すると、あるタイプから別のタイプへの変換が簡単になります。そのため、ここには、任意のプラットフォーム(Windows、Linux、Solaris、AIXなど)で使用できるマクロのセットがあります。

#define M_ToCharPtr(p)        reinterpret_cast<char*>(p)                   // Cast to char*
#define M_ToWCharPtr(p)       reinterpret_cast<wchar_t*>(p)                // Cast to wchar_t*
#define M_ToConstCharPtr(p)   reinterpret_cast<const char*>(p)             // Cast to const char*
#define M_ToConstWCharPtr(p)  reinterpret_cast<const wchar_t*>(p)          // Cast to const wchar_t*
#define M_ToUCharPtr(p)       reinterpret_cast<unsigned char*>(p)          // Cast to unsigned char*
#define M_ToConstUCharPtr(p)  reinterpret_cast<const unsigned char*>(p)    // Cast to const unsigned char*
#define M_ToUCharPtr(n)       reinterpret_cast<unsigned char*>(n)          // Cast to unsigned char*
#define M_ToVoidPtr(p)        reinterpret_cast<void*>(p)                   // Cast to void*
#define M_ToConstVoidPtr(p)   reinterpret_cast<const void*>(p)             // Cast to const void*
#define M_ToIntPtr(n)         reinterpret_cast<int*>(n)                    // Cast to int*
#define M_ToConstIntPtr(p)    reinterpret_cast<const int*>(p)              // Cast to const int*
#define M_ToDoublePtr(n)      reinterpret_cast<double*>(n)                 // Cast to double*
#define M_ToConstDoublePtr(n) reinterpret_cast<const double*>(n)           // Cast to const double*
#define M_ToBoolPtr(n)        reinterpret_cast<bool*>(n)                   // Cast to bool*
#define M_ToConstBoolPtr(n)   reinterpret_cast<const bool*>(n)             // Cast to const bool*

// General Cast
#define M_To(T, p)            reinterpret_cast<T>(p)                       // Cast to T

あなたの場合

const unsigned char* t = reinterpret_cast<const unsigned char *>("UCHAR TO CONST UCHAR");

に等しい

const unsigned char* t = M_ToConstUCharPtr("UCHAR TO CONST UCHAR");
1
SajithP

単に使用する

  1. 宣言中にunsigned char *の代わりにchar *のみ

  2. char t [MAX_SIZE] = "123"; // MAX_SIZEは前に定義する必要があります

  3. 時間テストstrcpy()およびstrncpy関数

0
malang