0

次の宣言があります。

#define ERROR   0x01
..
UINT32 res=ERROR;

variable だけを指定して、文字列を char 配列resにコピーすることは可能ですか?"ERROR"

説明

たぶん、私は十分に明確ではありませんでした。値を返す DLL を呼び出しています。これらの値は次のように解釈できます。

switch (res)
{
    case ERROR:
     strcpy(arr, "ERROR");break;
    case ... 
}

多くのオプションがあり、switch巨大になるので、近道があるのではないかとさまよった...

4

3 に答える 3

0

定義の名前を表示しますか? これは不可能です。おそらくあなたは次のようなものを探しています:

myString=(res==ERROR)?"ERROR":"OK"
于 2013-10-16T10:10:30.760 に答える
0
#define ERROR   0x01

定数整数リテラル0x01を定義し、プリプロセッサは次の行を返します。

UINT32 res = ERROR;

の中へ:

UINT32 res = 0x01;

コンパイルが始まる前。char 配列はありません。


次のようなことを避けるために、関連する定数の名前をコピーしたい場合:

case ERROR:
 strcpy(arr, "ERROR"); break;
case X:
 strcpy(arr, "X"); break;
case Y:
 strcpy(arr, "Y"); break;
...

次に、特定のコードで名前を取得する静的構造を持つヘルパーを作成することもできますが、型の安全性のため#defineに、可能な限り s を避けます。のようなもの (これは単なる概念です):

const char* getRetCodeName(const UINT32 code) {
    static std::map<int, const char*> codes;
    static int firstCall = 1;
    if (firstCall) {
        codes[ERROR] = "ERROR";
        codes[X] = "X";
        codes[Y] = "Y";
        firstCall = 0;
    }
    return codes[code];
}

そして呼び出し元のコードで:

UINT32 res = someCall();
const char* retCodeName = getRetCodeName(res);
于 2013-10-16T10:06:17.817 に答える
0

name に依存せずにこれをERROR行うことはできませんが、次のようなことができます。

const char* value_to_string(UINT32 val) {
  #define CHECK_CONSTANT(maConst) \
    if (val == maConst) return #maConst

  CHECK_CONSTANT(ERROR);
  return 0;

  #undef CHECK_CONSTANT
}

これはマクロの値から抽象化しますが、残念ながらその名前から抽象化することはできません。そのような が複数ある場合は#define、それらすべてを後続のCHECK_CONSTANT(something);行としてリストすることもできます。

于 2013-10-16T10:06:32.677 に答える