プログラミング

組込み開発にC18およびC++17を活用して性能と可読性を向上

<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >組込み開発にC18およびC++17を活用して性能と可読性を向上</span>
 

IAR Embedded Workbenchは最新のC11/C18、そしてC++14/C++17の規格に対応します。これらの規格をどのように組込み開発で活用すればいいのでしょうか?この記事では、これら新しいC言語規格で導入された機能についてご紹介します。

C言語の標準であるISO/IEC 9899:2012およびC++言語の標準であるISO/IEC 14882:2015、あるいはそれらを改善したC11/C++14が登場してしばらく経ちました。これらの標準はIAR Embedded Workbenchの最近のリリースで基本的に使用可能です。

C++言語は多くのプログラミング言語から影響を受けています。1979年にC言語を改善するプロジェクトの一つとして始まり、当初はC with classesと名付けられていたのが、1983年にC++言語に変わりました。初の商用リリースは1985年です。

簡単に言うと、C++14は、C99の問題を修正しようとしたC11をベースにしています。C11はC99の上位互換で、C++にも互換性が高いです。このためC言語とC++言語の混在を容易にします。実際のアプリケーションの中で、半導体ベンダはC言語で記述した低レベルのドライバを提供しています。C++言語で組込みアプリケーションを開発したい場合、C++言語で記述した自身のソースコードと、C言語で提供されたライブラリを、混在させることになります。このようなケースをIAR Embedded Workbenchはうまくサポートしており、その場合は Auto (extensions-based)(自動(拡張子ベース))の言語選択が推奨されます。

 

組込み開発にC18およびC++17を活用して性能と可読性を向上1

C++オプションのEnable exceptions(例外を有効にする)およびEnable RTTI RTTIを有効にする)が未サポートのアーキテクチャもあります

 

何が新しいのか?

ここでは一部の機能を列挙します。C18とC++17は主にC11とC++14の問題点を修正するためのものです。以下ではC11とC++14で新たに導入された機能を紹介します。

C11 で導入されC18に引き継がれた機能

  • キーワード_Genericを使用した型ジェネリック式
  • メモリアライメントの制御(stdalign.h)
  • _Noreturn関数指定子(stdnoreturn.h)
  • Unicodeのサポート改善(char16_t型やchar32_t型など)
  • 静的アサーション(_Static_assert宣言)
  • gets関数の削除
  • マクロ
    • 複素数の計算(complex.h)
    • 浮動小数点型の大きさや特性を表すマクロ定義(float.h)

C++14で導入されC++17に引き継がれた機能

  • 通常関数の戻り値の型推論
  • 二進数リテラル
  • [[deprecated]]および[[noreturn]]属性
  • ジェネリックラムダ
  • ムーブセマンティクス(左辺値を右辺値にキャスト)
  • 範囲ベースのfor文
  • basic_string型のリテラル演算子s
  • アトミック操作のライブラリ
  • NLLポインタ値を表すキーワード(nullptr)

現在のプロジェクトへの影響

CまたはC++のアプリケーションを移植することは簡単です。最も大きな変更はEmbedded C++および拡張Embedded C++とライブラリモードがサポートされなくなることです。これはユーザ独自にC++のサブセットが定義でき、C++を拡張できるという明確な理由からです。

Embedded C++のアプリケーションを移植する際、C++のライブラリ名がstd名前空間に存在することがよく問題となります。その場合、ユーザはライブラリの各参照にstd::を付加するか、各C++ソースコードまたはヘッダファイルにおいて、includeディレクティブの後、かつC++ライブラリの参照の前に下記の記述を挿入する必要があります。

using namespace std;

古い拡張Embedded C++のSTLサポート停止による副作用として、STLはデフォルトのメモリにしか存在せず、デフォルトのポインタでしか操作できません。詳細は、『C/C++開発ガイド』の「EC++ またはEEC++ からコードを移植」の章をご参照ください。

新しい標準への適合

C11からC18またはC++14からC++17へと、使用するC言語の規格を移行する際、より安全な標準関数や意識することなく性能向上の恩恵を受けることがあります。例えば、ムーブセマンティクスは、autoとアトミックを除き、コピーの最適化と再利用となります。その他の新しい機能もユーザがより生産的に、スマートに、可読性良くコードを記述することを助けます。