对于那些用D开发应用程序的人,
我想尝试D编程语言.我有一个简单的宠物项目,我一直想完成,我认为这是一个很好的学习机会D 2.0.
但是,我的主要操作系统是使用Windows 7 64位的kubuntu 64位双启动,我似乎无法让它工作.该项目将使用SDL,我怀疑我的64位操作系统可能是问题.
D64位的当前状态是什么?有没有人有这方面的工作经验?
顺便说一下,我没有兴趣D 1.0,所以它D 2.0或者是破产.
D容易接口C.
D同样容易接口C++,但(并且它很大但是)C++需要非常微不足道.代码不能使用:
我完全理解继承限制.然而,其余的,感觉像人为限制.现在我不想std::vector<T>直接使用,但我真的希望能够std::vector<int>作为一个外部模板链接.
在C++接口页有这个特别令人沮丧的评论.
D模板与C++模板几乎没有共同点,并且不太可能找到任何合理的方法以与D链接兼容的方式表达C++模板.
这意味着可能永远无法从D中访问C++ STL和C++ Boost.
不可否认,我可能永远不需要std::vector编码D,但我喜欢使用QT或提升.
那是什么交易.为什么C++在D中表达非平凡的类很难?是否值得添加一些特殊的注释或某些东西来表达至少名称空间?
更新:"D在工程中有命名空间支持"来自Walter Bright.
有一段时间我对D'运算符重载的方向感到困惑,但现在我意识到它是一个漂亮的系统...如果它只适用于核心类型(int,float等).考虑以下代码:
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
Y.opOpAssign!op(vector.Y); // ERROR: ditto
}
}
Run Code Online (Sandbox Code Playgroud)
这将是漂亮的代码,如果它工作,看到它在一个方法中重载所有+ =, - =,*=等运算符.但是,正如您所看到的,它不是开箱即用的.我用模板创建了一个解决方案(上帝,我爱D):
template Op(string op, T) {
void Assign(ref T a, T b) {
static if (op == "+") a += b;
else if (op == "-") a -= b;
else if (op == "*") a *= b;
else if (op == "/") a /= b;
}
}
struct Vector {
float …Run Code Online (Sandbox Code Playgroud) 当使用具有try/catch/finally的语言时,D的失败/成功/退出范围语句是否仍然有用?D似乎没有最终可以解释为什么在D中使用这些语句.但是使用像C#这样的语言是否有用?我正在设计一种语言,所以如果我看到很多专业人士,我会加入它.
今天我听说过D编程,它与C代码兼容.不过我还没有找到任何关于是否可以使用D的GT库或PortAudio等C库的信息?如果有可能,你能解释一下如何做到这一点吗?
因此,有很多关于从D内部调用C API的信息,但反过来怎么样?在D中编写一个像普通C共享库一样工作的库需要做什么?这是一个简单的案例:
main.c中
extern int foo(int x);
void main() {
printf("foo(5)=%d\n",foo(5));
}
Run Code Online (Sandbox Code Playgroud)
餐饮
extern(C)
{
int foo(int x)
{
return x*x;
}
}
Run Code Online (Sandbox Code Playgroud)
天真地尝试使用gcc和dmd构建和链接这些只会导致链接器错误.
链接gcc main.o foo.o:
doFoo.o: In function `no symbol':
doFoo.d:(.text+0x7): undefined reference to `_Dmodule_ref'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
与dmd main.o foo.o链接:
/usr/lib64/libphobos2.a(deh2_2eb_525.o): In function `_D2rt4deh213__eh_finddataFPvZPS2rt4deh213DHandlerTable':
src/rt/deh2.d:(.text._D2rt4deh213__eh_finddataFPvZPS2rt4deh213DHandlerTable+0xa): undefined reference to `_deh_beg'
src/rt/deh2.d:(.text._D2rt4deh213__eh_finddataFPvZPS2rt4deh213DHandlerTable+0x14): undefined reference to `_deh_beg'
src/rt/deh2.d:(.text._D2rt4deh213__eh_finddataFPvZPS2rt4deh213DHandlerTable+0x1e): undefined reference to `_deh_end'
src/rt/deh2.d:(.text._D2rt4deh213__eh_finddataFPvZPS2rt4deh213DHandlerTable+0x46): undefined reference to `_deh_end'
/usr/lib64/libphobos2.a(lifetime.o): In function `_D2rt8lifetime18_sharedStaticCtor9FZv':
src/rt/lifetime.d:(.text._D2rt8lifetime18_sharedStaticCtor9FZv+0x15): undefined reference to `_tlsend'
src/rt/lifetime.d:(.text._D2rt8lifetime18_sharedStaticCtor9FZv+0x29): …Run Code Online (Sandbox Code Playgroud) 我试图理解之间的区别const ref和in,特别是当它涉及到性能.
我知道这in相当于const scope,但是什么the scope storage class means that references in the parameter cannot be escaped (e.g. assigned to a global variable).意思?示例代码是受欢迎的.
如何在实现功能之间const ref和之间做出决定in?我知道ref对象不会被复制,因为它是一个引用,但是同样如此in?