ldc和gdc是否支持D语言合同?

时间:2017-10-21 06:11:01

标签: d dmd gdc ldc

此代码与合同:

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前端。

2 个答案:

答案 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前端版本。 ldcldc2 --version显示,例如。