Compatibilidad del compilador con GNU Statement Expression

2 minutos de lectura

Compatibilidad del compilador con GNU Statement
osgx

Qué compiladores modernos admiten la expresión Gnu Statement (lenguajes C y C++). ¿Qué versiones debo tener para usar una declaración de expresiones?

La expresión de declaración es algo así como ({ code; code; retval }):

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

Ya conozco algunos compiladores de este tipo:

Este compilador parece no admitir esto (no estoy seguro):

  • MS Visual C++

PD. se enumeran algunos compiladores de C/C++ aquí pero solo me interesan los compiladores maduros, que se usan ampliamente (por ejemplo, no un tcc o turbo c)

El conjunto de compiladores PathScale® EKOPath

Es compatible con gnu99 con “−std=gnu99

Intel C++ Compiler no admite expresiones de declaración, incluso la última versión que conozco, la versión 13.0.

  • Pero la página dice “Se admiten las expresiones de declaración, excepto que las siguientes están prohibidas dentro de ellas:“.. y esto, página4 dice que es cierto desde Intel C++ Compiler versión 6.0

    – osgx

    9 de enero de 2013 a las 7:42

Compatibilidad del compilador con GNU Statement
lrineau

Como dije en el comentario de mi respuesta anterior, Intel Compiler admite las expresiones de declaración. Pero la emulación por parte de Intel de esa extensión GNU no está completa, en C++. El siguiente código está tomado de 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;
}

Un comentario en el código incluso da el error devuelto por Intel Compiler, probado con la versión 11, 12 o 13.

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad