Skip to main content

IAR Embedded Workbench for Arm 9.70.x

C++ 言語拡張

このセクションの内容:

コンパイラをC++モードで使用し、IAR言語拡張を有効にする場合、以下のC++言語拡張がコンパイラで使用できます。

  • クラスのfriend宣言において、classキーワードを省略できます。以下に例を示します。

    class B;
    class A
    {
      friend B;       //Possible when using IAR language
                      //extensions
      friend class B; //According to the standard
    };
  • クラスメンバの宣言において、修飾名を使用できます。以下に例を示します。

    struct A 
    {
      int A::F(); // Possible when using IAR language extensions
      int G();    // According to the standard
    };
  • Cリンケージ(extern "C")を持つ関数のポインタと、C++リンケージ(extern "C++")を持つ関数のポインタとの間の暗黙的な型変換の使用が許可されています。以下に例を示します。

    extern "C" void F(); // Function with C linkage
    void (*PF)()       // PF points to a function with C++ linkage
                 = &F; // Implicit conversion of function pointer. 

    規格では、ポインタは明示的に変換する必要があります。

  • ??演算子を含む構造体の2番目または3番目のオペランドが文字列リテラルまたはワイド文字列リテラル(C++の場合の定数)の場合、オペランドを暗黙的にchar *またはwchar_t *に変換できます。以下に例を示します。

    bool X;
    
    char *P1 = X ? "abc" : "def";       //Possible when using IAR
                                        //language extensions
    char const *P2 = X ? "abc" : "def";//According to the standard
  • 関数パラメータに対するデフォルトの引数は、規格に従ったトップレベルの関数宣言の中ではなく、typedef宣言の中、関数へのポインタの関数宣言の中、メンバへのポインタの関数宣言の中でも指定できます。

  • 非静的ローカル変数を含む関数、評価されない式(sizeof式など)を含むクラスにおいては、式から非静的ローカル変数を参照できます。ただし、ワーニングが出力されます。

  • typedef名によって、包含するクラスに無名共用体を導入できます。最初に共用体を宣言する必要はありません。以下に例を示します。

    typedef union 
    {
      int i,j;
    } U;  // U identifies a reusable anonymous union.
    
    class A
    {
    public:
      U;  // OK ‑‑ references to A::i and A::j are allowed.
    };

    また、この拡張はanonymous classesおよびanonymous structsも許可します。ただし、C++の機能がなく(たとえば、静的データメンバやメンバ関数を持たず、パブリックでないメンバがないなど)、他の匿名クラスや構造体、共用体以外のネスト型を持たないことが条件です。以下に例を示します。

    struct A
    {
      struct
      {
        int i,j;
      }; // OK ‑‑ references to A::i and A::j are allowed.
    };
  • friendクラスの構文では、non-class型のほか、精密型名なしにtypedefによって表現されたクラス型も使用可能です。以下に例を示します。

    typedef struct S ST;
    
    class C
    {
    public:
      friend S;  // Okay (requires S to be in scope)
      friend ST; // Okay (same as "friend S;")
      // friend S const; // Error, cv-qualifiers cannot
                         // appear directly
    };
  • それは、structの最後のメンバとしてサイズなしまたはサイズ0の配列を指定できます。以下に例を示します。

    typedef struct
    {
      int i;
      char ir[0]; // Zero-length array
    };
    
    typedef struct
    {
      int i;
      char ir[];  // Zero-length array
    };
  • 不完全型の配列

    配列では、不完全なstructunionenum、またはclassをエレメントの型として使用できます。型は、配列が使用される場合はその前に、使用されない場合はコンパイル単位の終了までに完全にする必要があります。

  • 文字列の連結

    混合した文字列リテラルの連結が許可されています。

    wchar_t * str = "a" L "b";
  • 最後のカンマ

    列挙型の定義にある最後のカンマは、表示されないでも許可されます。

ただし、Cの拡張が説明されているところは、C++モードも許可されます。

注記

最初に言語拡張を有効にせずに、これらの構造体のいずれかを使用すると、エラーが出力されます。