我试图用Java调用C ++ DLL。在其C ++头文件中,有以下几行:
#define a '102001'
#define b '102002'
#define c '202001'
#define d '202002'
a,b,c和d是什么类型的数据?他们是char还是char数组?我应该转换为Java中的相关数据类型是什么?
答案 0 :(得分:5)
正如Mysticial所指出的,这些是multicharacter literals。它们的类型依赖于实现,但它可能是Java long
,因为它们使用48位。
在Java中,您需要手动将它们转换为long
:
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");
答案 1 :(得分:1)
我可能会尝试回答前两个问题。由于不熟悉java,我不得不把最后一个问题留给别人。
单引号和双引号表示C中的内容非常不同。用单引号括起来的字符与在整理顺序中表示它的整数相同(例如,在ASCII实现中,&#39; a&#39;表示完全相同与97)相同。
但是,用双引号括起来的字符串是一种编写指向无名数组初始字符的指针的简便方法,该数组已使用引号和二进制值为0的额外字符进行初始化。 / p>
因为整数总是足以容纳多个字符,所以C编译器的 某些 实现允许字符常量中的多个字符以及字符串常量,这意味着写作&#39; abc&#39;而不是&#34; abc&#34;很可能没有被发现。然而,&#34; abc&#34;指的是一个指向包含4个字符(a,b,c和\ 0)的数组的指针,而“abc”是指&#39; abc&#39;是平台依赖的。许多C编译器将其视为&#34;一个整数,它以某种方式组成了字符a,b和c的值。
有关更多信息,您可以阅读本书的第1.4章&#34; C陷阱和陷阱&#34;