【问题标题】:Compiler support of GNU Statement ExpressionGNU 语句表达式的编译器支持
【发布时间】:2011-09-20 08:48:35
【问题描述】:

哪些现代编译器支持 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


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • the page 说“支持语句表达式,但其中禁止以下内容:”.. 并且this, page4 说这是真的,因为英特尔 C++ 编译器版本6.0
      【解决方案3】:

      正如我之前回答的评论中所说,英特尔编译器确实支持语句表达式。但是英特尔对那个 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;
      }
      

      代码中的注释甚至给出了英特尔编译器返回的错误,使用版本 11、12 或 13 进行测试。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多