Java で C++ DLL を呼び出そうとしています。その C++ ヘッド ファイルには、次の行があります。
#define a '102001'
#define b '102002'
#define c '202001'
#define d '202002'
a、b、c、および d のデータ型は何ですか? それらはcharまたはchar配列ですか?そして、変換する必要があるJavaの対応するデータ型は何ですか?
Mysticialが指摘したように、これらは複数文字のリテラルです。それらの型は実装に依存しますがlong
、48 ビットを使用するため、おそらく Java です。
long
Java では、手動で変換する必要があります。
static long toMulticharConst(String s) {
long res = 0;
for (char c : s.toCharArray()) {
res <<= 8;
res |= ((long)c) & 0xFF;
}
return res;
}
final long a = toMulticharConst("102001");
final long b = toMulticharConst("102002");
final long c = toMulticharConst("202001");
final long d = toMulticharConst("202002");
最初の 2 つの質問に答えようとするかもしれません。Java に慣れていないので、最後の質問は他の人に任せる必要があります。
C では、一重引用符と二重引用符はまったく異なる意味を持ちます。一重引用符で囲まれた文字は、照合シーケンスでそれを表す整数とまったく同じです (たとえば、ASCII 実装では、'a' は 97 とまったく同じことを意味します)。
ただし、二重引用符で囲まれた文字列は、引用符で囲まれた文字とバイナリ値が 0 の余分な文字で初期化された名前のない配列の最初の文字へのポインターを簡単に記述する方法です。
整数は常に複数の文字を保持するのに十分な大きさであるため、C コンパイラの一部の実装では、文字定数と文字列定数で複数の文字を許可しています。ただし、「abc」は、4 文字 (a、b、c、および \0) を含む配列を指すポインターを意味しますが、「abc」の意味はプラットフォームに依存します。C コンパイラの多くは、「文字 a、b、および c の値から何らかの形で構成される整数」を意味すると解釈します。
詳細については、本「C の罠と落とし穴」の 1.4 章を参照してください。