2011-06-22 15 views
20

का कंपाइलर समर्थन कौन सा आधुनिक कंपाइलर्स जीएनयू स्टेटमेंट एक्सप्रेशन (सी और सी ++ भाषाओं) का समर्थन करता है। मुझे कथन अभिव्यक्तियों का उपयोग करने के लिए किन संस्करणों का उपयोग करना चाहिए?जीएनयू स्टेटमेंट एक्सप्रेशन

वक्तव्य अभिव्यक्ति है ({ code; code; retval }) तरह ख़ाली:

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

मैं पहले से ही कुछ ऐसे compilers पता:

  • जीसीसी> = 3
  • बजना/LLVM> =?
  • इंटेल सी ++ संकलक> = 6.0 (लिनक्स संस्करण, check page 4; सा limited)
  • सूर्य स्टूडियो> = 12 (New Language Extensions)
  • आईबीएम एक्स्ट्रा लार्ज z/OS के लिए (marked as IBM extension)
  • Open64 (के रूप में यह का उपयोग करता है ओस्प्रे-जीसीसी दृश्यपटल)

इस संकलक इसके समर्थन में नहीं (मैं अनिश्चित हूँ) लगता है:

  • एमएस विजुअल सी ++

पीएस। कुछ C/C++ compilers here सूचीबद्ध हैं, लेकिन मैं केवल परिपक्व compilers, कि व्यापक रूप से इस्तेमाल कर रहे हैं में रुचि रखते हैं (जैसे नहीं एक TCC या टर्बो ग)

उत्तर

1

gnu99 का समर्थन इंटेल सी ++ कंपाइलर कथन अभिव्यक्तियों का समर्थन नहीं करता है, यहां तक ​​कि अंतिम संस्करण जो मुझे पता है, संस्करण 13.0।

+1

लेकिन [पेज] (http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/2011Update/cpp/lin/bldaps_cls/ सामान्य/bldaps_gcc_compat_comm.htm) कहता है "* स्टेटमेंट एक्सप्रेशन समर्थित हैं, सिवाय इसके कि निम्नलिखित में निषिद्ध है: *" .. और [यह, पेज 4] (http://scc.ustc.edu.cn/zlsc/lenovo_1800/200910 /W020100308600680463493.pdf) कहता है कि यह सच sinc है ई इंटेल सी ++ कंपाइलर संस्करण 6.0 – osgx

+0

आप सही हैं। मैं एक बेहतर जवाब दूंगा। – lrineau

0

जैसा कि मेरे पिछले उत्तर की टिप्पणी में कहा गया है, इंटेल कंपाइलर कथन अभिव्यक्तियों का समर्थन करता है। लेकिन उस जीएनयू एक्सटेंशन के इंटेल द्वारा अनुकरण सी ++ में पूरा नहीं हुआ है।

#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: निम्नलिखित कोड से CGAL-4.0 (http://www.cgal.org/) लिया जाता है , या 13.

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

संबंधित मुद्दे