Go to main content

Oracle® Developer Studio 12.6 リリースの新機能

印刷ビューの終了

更新: 2017 年 7 月
 
 

C++ コンパイラの変更点

このセクションには、全コンパイラに共通の新機能および変更点に記載されている変更点も含まれます。

このリリースでの C++ コンパイラに固有の新機能は次のとおりです。

  • 新しい section 属性 – C++ コンパイラでは、特定のセクションに存在する変数または関数を指定する新しい section 属性を提供するようになりました。

  • -xO3インライン化動作の変更 - 本体が呼び出し側のオーバーヘッドよりも小さい関数の自動インライン化をサポートします。また、-xO3 および -xO4 は、–xspace オプションとともに使用すると、最小のコードサイズになります。

  • –xlibmopt オプションの変更–xlibmopt オプションは、–%none–archive、および –shared サブオプションで拡張されました。

  • libCrunG3 が Linux では静的にリンクされるlibCrunG3 は、-compat=g-std=c++03-std=c++11、または -std=c++14 のいずれかのオプションでコンパイルされる C++ プログラムで必要な実行時サポートライブラリです。

    Oracle Solaris では、libCrunG3 は必要に応じて、デフォルトで動的にリンクされます。これは Oracle Solaris オペレーティングシステムの一部であるため、常にユーザープログラムによって検出できます。Linux では、このライブラリに動的にリンクする場合、使用しているプログラムで libCrunG3.so.1 を指定することが必要になります。この問題を回避するために、Linux では libCrunG3 は必要に応じて、デフォルトで静的にリンクされます。

  • 関数の多重定義の解決におけるエラー通知の改善 – Oracle Developer Studio および Oracle Solaris Studio の以前のコンパイラでは、多重定義された関数のあいまい呼び出しや解決不能呼び出しを通知する際に詳細メッセージが含まれていませんでした。Oracle Developer Studio 12.6 では、エラー通知が改善されました。次の例は、改善されたエラー通知機能を示しています。

    Example 1:
    
    % cat ex1.cc
    void f(int n, int* ptr);
    void f(int, int, int);
    void f(int);
    void foo()
    {
        f(1, 2);
    }

    以前のコンパイラでは、次のようなメッセージが通知されました。

    % CC -c ex1.cc
    "ex1.cc", line 7: Error: Could not find a match for f(int, int) needed in
    foo().
    1 Error(s) detected.
    

    Oracle Developer Studio 12.6 C++ コンパイラでは、一致するものが見つからなかった理由について詳細な情報を提供します。

    % CC -c ex1.cc
    "ex1.cc", line 7: Error: Could not find a match for f(int, int) needed in
    foo().
    "ex1.cc", line 1: Note: Candidate 'f(int, int*)' is not viable: argument
    'ptr' can't be converted from 'int' to 'int*'.
    "ex1.cc", line 3: Note: Candidate 'f(int)' is not viable: too many arguments.
    "ex1.cc", line 2: Note: Candidate 'f(int, int, int)' is not viable: too few
    arguments.
    Example 2:
    
    % cat ex2.cc
    struct A;
    struct B {
        B(const A&);
    };
    struct D1 : B {};
    struct D2 : B {};
    struct A {
        A();
        operator  D1() const;
        operator  D2&() volatile ;
    };
    void foo(A& ra)
    {
        A va;
        B vb  = ra;
    }

    以前のコンパイラでは、次のようなメッセージが通知されました。

    % CC -c ex2.cc
    "ex2.cc", line 19: Error: Overloading ambiguity between "A::operator D1()
    const" and "B::B(const A&)".
    "ex2.cc", line 19: Error: Cannot use A to initialize B.
    2 Error(s) detected.

    Oracle Developer Studio 12.6 C++ コンパイラでは、あいまいさについて詳細な情報を提供します。

    % CC -c ex2.cc
    "ex2.cc", line 19: Error: Type conversion 'A' -> 'B' is ambiguous.
    "ex2.cc", line 12: Note: Viable candidate 'A::operator D1() const'.
    "ex2.cc", line 4: Note: Viable candidate 'B::B(const A&)'.
    "ex2.cc", line 13: Note: Viable candidate 'A::operator D2&() volatile'.
    "ex2.cc", line 19: Error: Cannot use A to initialize B.
    
    You can disable generation of the Notes by using the CC option
        -features=no%note

詳細は、Oracle Developer Studio 12.6: C++ User’s Guideおよび CC(1) のマニュアルページを参照してください。