此代码与合同:
import std.stdio;
int TestContract(int a)
in
{
assert( a > 0);
}
do
{
return a + 1;
}
int main(string[] args)
{
auto a = 2;
try
{
writeln(a," + 1 is ",TestContract(a));
a = -2;
writeln(a," + 1 is ",TestContract(a));
}
catch (Exception e)
{
writeln(e);
}
return 0;
}
使用dmd(v2.076.0-dirty)编译并运行,但不是ldc(0.17.1)或gdc(5.4.0 20160609)。
ldc说:
contracts.d(12): Error: declaration expected, not 'do'
contracts.d(15): Error: unrecognized declaration
和gdc说:
contracts.d:12:1: error: declaration expected, not 'do'
do
^
contracts.d:15:1: error: unrecognized declaration
}
编辑:使用" body"进行编译而不是"做",每个答案成功与ldc。 gdc得到一个新的编译错误:
/usr/include/d/core/stdc/stdarg.d:48:5: error: undefined identifier __va_list_tag
alias __va_list = __va_list_tag;
请注意,目前enter link description here的dlang.org文档未提及 body ,虽然可能已弃用,但仍然有效,并且对于早期版本的dmd编译器是必需的比[未知版本]和任何版本的gdc或ldc在版本[未知版本]之前使用dmd前端。
答案 0 :(得分:2)
使用body
,而不是do
。允许do
代替body
是最近的事情(我不知道这个变化甚至被接受了,虽然它与当前的dmd一起编译,所以我猜它是。) / p>
dmd,ldc和gdc都共享相同的前端,但它们并不都具有相同的版本。即使你正在使用最新的ldc,它至少有一个,也许是dmd后面的两个版本,除非你使用的是gdc的开发版本,否则它目前是方式落后(它在2.068 IIRC,而dmd 2.077.0目前处于测试阶段),尽管他们所做的下一个版本应该最终接近dmd(从C ++到前端的转换) D导致他们严重延误)。
答案 1 :(得分:2)
是的,ldc和gdc都支持合同。这是最近的语言更改 - 在合同中将do
替换为body
并进行编译。您应该始终注意使用相同的D前端版本。 ldc
以ldc2 --version
显示,例如。