LoginSignup
0
0

More than 5 years have passed since last update.

extern(C++)時のwchar及びdcharの名前修飾が変

Last updated at Posted at 2014-08-11

D 2.067.0にて修正されました

環境:Windows
バージョン:2.065及び2.066.0-rc2

C++で書かれたライブラリ等を利用しようとした時に
extern(C++)と書くことでx64であれば
MSVC++でコンパイルされたlibやobjを直接リンクすることができますが
dmd側の名前修飾が正しくないのではないかと思います

test.d
extern(C++){
    void fc2(wchar){}
    void fc4(dchar){}
}
test.cpp
void fc2(wchar_t){}

test.cppのobj
cl 17.00.50727.1 (MSVC++) x86/x64
void fc2(wchar_t) ?fc2@@YAX_W@Z void __cdecl fc2(wchar_t) // msvc
dmc 8.42n x86
void fc2(wchar_t) ?fc2@@YAX_Y@Z void __cdecl fc2(wchar_t) // dmc

test.dのobj
dmd 2.065 x86/x64
void fc2(wchar) ?fc2@@YAX_Y@Z void __cdecl fc2(wchar_t) // dmc
void fc4(dchar) ?fc4@@YAXK@Z void __cdecl fc4(unsigned long)

dmd 2.066.0-rc2 x86
void fc2(wchar) ?fc2@@YAXG@Z void __cdecl fc2(unsigned short)
void fc4(dchar) ?fc4@@YAX_Y@Z void __cdecl fc2(wchar_t) // dmc

dmd 2.066.0-rc2 x64
void fc2(wchar) ?fc2@@YAXG@Z void __cdecl fc2(unsigned short)
void fc4(dchar) ?fc4@@YAX_W@Z void __cdecl fc4(wchar_t) // msvc

期待される名前修飾 x86 (dmc製objとリンク可能)
void fc2(wchar) ?fc2@@YAX_Y@Z void __cdecl fc2(wchar_t) // dmc
void fc4(dchar) ?fc4@@YAXK@Z void __cdecl fc4(unsigned long)

期待される名前修飾 x64 (msvc製objとリンク可能)
void fc2(wchar) ?fc2@@YAX_W@Z void __cdecl fc2(wchar_t) // msvc
void fc4(dchar) ?fc4@@YAXK@Z void __cdecl fc4(unsigned long)

2.065はdmcから引きずったバグなのかと思いましたが
(↑dmcとmsvcのwchar_tの名前修飾が違うのは仕様のようです)
2.0660-rc2ではよりおかしくなっているようにも感じます

wchar_tの厳密な正しい表現ではないかもしれませんが
http://dlang.org/htod.html では
wchar_tをwcharに変換すると表記されているので間違ってはいないと思います

8/13: dcharの大きさと記載不足などを修正
2015/12/17: だいぶ前に直っているが修正

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0