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

问题描述 投票:0回答:3

哪些现代编译器支持 Gnu 语句表达式(C 和 C++ 语言)。我应该在什么版本中使用语句表达式?

语句表达式类似于

({ code; code; retval })
:

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

我已经知道一些这样的编译器:

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

  • MS Visual C++

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

c visual-c++ compiler-construction c99 compiler-extension
3个回答
3
投票

1
投票

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


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/

© www.soinside.com 2019 - 2024. All rights reserved.