GNU语句表达式的编译器支持

28

现代编译器支持GNU语句表达式(C和C++语言),需要使用哪些版本才能使用语句表达式?

语句表达式类似于({ code; code; retval })

int b=56;
int c=({int a; a=sin(b); a;});

我已经了解到一些这样的编译器:

  • GCC >=3
  • Clang/LLVM >= 3.0.0
  • Intel C++ Compiler >= 6.0(Linux版本,请查看第4页;位数有限
  • Sun Studio >= 12(新语言扩展
  • IBM XL for z/OS(标记为IBM扩展
  • Open64(因为它使用 osprey-gcc 前端)

这个编译器似乎不支持这个(我不确定):

  • MS Visual C ++

PS. 这里列出了一些C/C ++编译器(链接),但我只对成熟的编译器感兴趣,这些编译器被广泛使用(例如不是tcc或turbo c)。

3个回答

2

1
如我之前回答中所述,英特尔编译器确实支持语句表达式。但是在 C++ 中,英特尔对 GNU 扩展的仿真并不完整。以下代码摘自 CGAL-4.0(http://www.cgal.org/)。
#include <cassert>

struct A {
  int* p;

  A(int i) : p(new int(i)) {}
  ~A() { delete p; }
  int value() const { return *p;}
};

int main()
{
  int i = __extension__ ({ int j = 2; j+j; });
  assert(i == 4);

  // The Intel Compiler complains with the following error:
  // "error: destructible entities are not allowed inside of a statement
  // expression"
  // See http://software.intel.com/en-us/articles/cdiag1487/
  i = __extension__ ({ A a(2); A b(3); a.value() + b.value(); });

  assert(i == 5);
  return 0;
}

代码中的注释甚至提供了由英特尔编译器返回的错误,测试版本为11、12或13。

http://software.intel.com/en-us/articles/cdiag1487/


1

英特尔 C++ 编译器不支持语句表达式,即使是我所知道的最新版本 13.0 也不支持。


1
但是该页面说:“支持语句表达式,除以下内容外都被禁止使用:”...而且这个页面4说自从Intel C++编译器6.0版本以来这是真的。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接