Поддержка компилятором выражения выражения GNU - PullRequest
21 голосов
/ 22 июня 2011

Какие современные компиляторы поддерживают выражение Gnu Statement (языки C и C ++).В каких версиях я должен использовать выражения оператора?

Выражение оператора имеет вид чего-то вроде ({ code; code; retval }):

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

Я уже знаю несколько таких компиляторов:

Этот компилятор, кажется, не поддерживает это (я не уверен):

  • MS Visual C ++

PS.некоторые компиляторы C / C ++ перечислены здесь , но меня интересуют только зрелые компиляторы, которые широко используются (например, не tcc или turbo c)

Ответы [ 3 ]

2 голосов
/ 08 октября 2011
1 голос
/ 07 января 2013

Компилятор Intel C ++ не поддерживает выражения операторов, даже последняя известная мне версия 13.0.

0 голосов
/ 17 января 2013

Как сказано в комментарии к моему предыдущему ответу, Intel Compiler поддерживает выражения операторов. Но эмуляция Intel этого расширения GNU не завершена, в C ++. Следующий код взят из 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;
}

Комментарий в коде даже дает ошибку, возвращенную компилятором Intel, протестированную с версией 11, 12 или 13.

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

...