1

此代码与合同:

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)。

最不发达国家 说:

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”而不是“do”进行编译,根据 ldc 的答案成功。gdc 得到一个新的编译错误:

/usr/include/d/core/stdc/stdarg.d:48:5: error: undefined identifier __va_list_tag
     alias __va_list = __va_list_tag;

请注意,目前合同编程的 dlang.org 文档没有提到body,虽然可能已弃用,但仍然有效,并且对于早于 [未知版本] 的 dmd 编译器版本和任何 gdc 或 ldc 版本是必需的在版本 [未知版本] 之前使用 dmd 前端。

4

2 回答 2

2

使用body,不使用do。允许do而不是body最近的事情(我不知道该更改甚至已被接受,尽管它与当前的 dmd 一起编译,所以我猜是这样)。

dmd、ldc 和 gdc 都共享相同的前端,但它们的版本不同。即使您使用的是最新的 ldc,它也至少比 dmd 落后了一个,也许是两个版本,除非您使用的是 gdc 的开发版本,否则它目前已经落后了(它是 2.068 IIRC,而 dmd 2.077.0 是目前处于测试阶段),尽管他们所做的下一个版本最终应该非常接近 dmd(从 C++ 到 D 的前端切换对他们造成了重大延迟)。

于 2017-10-21T06:21:03.070 回答
2

是的,ldc 和 gdc 都支持合约。这是最近的语言更改 - 在合同中替换dobody并编译。您应该始终注意您使用的是相同的 D 前端版本。例如ldc,用 显示它。ldc2 --version

于 2017-10-21T06:32:28.203 回答