如何在D2.0中使用wchar**初始化wstring[] 在C++中,我可以用WHARGURT**初始化向量,如在这个例子中: #include <windows.h> #include <string> #include <vector> #include <cwchar> using namespace std; int main() { int argc; wchar_t** const args = CommandLineToArgvW(GetCommandLineW(), &argc); if (args) { const vector<wstring> argv(args, args + argc); LocalFree(args); } } #包括 #包括 #包括 #包括 使用名称空间std; int main(){ int-argc; wchar\u t**const args=CommandLineToArgvW(GetCommandLineW(),&argc); 如果(args){ 常量向量argv(args,args+argc); LocalFree(args); } }

如何在D2.0中使用wchar**初始化wstring[] 在C++中,我可以用WHARGURT**初始化向量,如在这个例子中: #include <windows.h> #include <string> #include <vector> #include <cwchar> using namespace std; int main() { int argc; wchar_t** const args = CommandLineToArgvW(GetCommandLineW(), &argc); if (args) { const vector<wstring> argv(args, args + argc); LocalFree(args); } } #包括 #包括 #包括 #包括 使用名称空间std; int main(){ int-argc; wchar\u t**const args=CommandLineToArgvW(GetCommandLineW(),&argc); 如果(args){ 常量向量argv(args,args+argc); LocalFree(args); } },d,D,但是,在D2.0中是否有方法使用wchar**初始化wstring[] 我可以这样将wchar**的内容添加到wstring[]中: import std.c.windows.windows; import std.c.wcharh; extern(Windows) { wchar* GetCommandLineW(); wchar** CommandLineToArgvW(wchar*, int*); void* LocalFree(void*); } void m

但是,在D2.0中是否有方法使用wchar**初始化wstring[]

我可以这样将wchar**的内容添加到wstring[]中:

import std.c.windows.windows;
import std.c.wcharh;

extern(Windows) {
    wchar* GetCommandLineW();
    wchar** CommandLineToArgvW(wchar*, int*);
    void* LocalFree(void*);
}

void main() {
    int argc;
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (args) {
        wstring[] argv;
        for (size_t i = 0; i < argc; ++i) {
            wstring temp;
            const size_t len = wcslen(args[i]);
            for (size_t z = 0; z < len; ++z) {
                temp ~= args[i][z];
            }
            argv ~= temp;
        }
        LocalFree(args);
    }
}
导入std.c.windows.windows;
进口标准c.wcharh;
外部(窗口){
wchar*GetCommandLineW();
wchar**命令行到argvw(wchar*,int*);
void*LocalFree(void*);
}
void main(){
int-argc;
wchar**args=CommandLineToArgvW(GetCommandLineW(),&argc);
如果(args){
wstring[]argv;
对于(大小i=0;i

<>但是,我想找到一个更干净、更简单的方法,比如C++版本。(性能不是问题)

下面是一个使用切片的简单版本:

import std.c.windows.windows;
import std.c.wcharh;
import std.conv;

extern(Windows) {
    wchar* GetCommandLineW();
    wchar** CommandLineToArgvW(wchar*, int*);
    void* LocalFree(void*);
}

void main() {
    int argc;
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (args) {
        wstring[] argv = new wstring[argc];
        foreach (i, ref arg; argv)
            arg = to!wstring(args[i][0 .. wcslen(args[i])]);
        LocalFree(args);
    }
}
另一个选项是使用
voidmain(string[]args)
,如果您确实需要,可以转换为args wstring。

您可以使用

void main(wstring[] args){
//...
}
更容易获得命令行参数


编辑:在d中获得字符指针的唯一原因是如果您直接使用C函数,而90%的时间您不需要(或应该将其抽象掉)

wstring[]不支持主参数。它不会编译-函数d主参数必须是main()或main(string[]args)。字符串[]中的字符串参数是否编码为UTF-8?我使用CommandLineToArgvW获取宽的命令行参数(可能包含各种unicode字符),然后使用std.utf.toUTF8()将每个参数转换为编码为utf-8的字符串。如果字符串[]args满足这个条件,那么我将使用它。但是,我不这么认为。话虽如此,如果我修改您的示例,将argv更改为字符串[],并使用std.utf.toUTF8()而不是to!wstring(),我认为它产生了我想要的结果。但是,如果main(string[]args)确实产生相同的utf-8编码,我肯定会使用它。如果我导入std.string,dmd会说std.string.wcslen与core.stdc.wchar\uuz.wcslen冲突。因此,如果有一种不使用wcslen()的好方法,那也太好了。字符串=UTF-8,wstring=UTF-16,dstring=UTF-32。D运行时必须将参数作为正确编码的utf-8字符串提供,因此,如果您将命令参数转换为utf-8,则只需使用
void main(string[]args)
即可。关于名称冲突,D对可能的标识符劫持持迂腐态度,因此如果存在冲突,可以使用完整标识符解决,例如,
intfoo=core.stdc.wchar\uuu.wcslen(您的字符串)。解决此问题的另一种方法是在导入时重命名函数,例如
import std.string:wideStringLength=wcslen。此语句将仅从
std.string
模块导入一个函数
wcslen
,并将其重命名为
wideStringLength
。这将解决名称冲突
wsclen
将调用
core.stdc.wchar\uuuu.wcslen
wideStringLength
将调用
std.string.wcslen