e2studioを用いてGCC(C++)で開発する

目的

ルネサスが提供しているRX用C++コンパイラはなかなかに使えないので,お手軽にC++11を使える方法を考えます。
ルネサスが公式サポートしている,KPIT GNU Toolse2studioで使えるようにします。

環境を整える

KPIT GNU Toolsの入手

KPIT GNU Tools公式サイトでユーザー登録を行う必要があります。
パスワードの発行に少し時間がかかる可能性があるので,予め済ませておきましょう。

ログインして,使うマイコンのコンパイラ(今回の場合GNURX v12.xx Windows Tool Chain (ELF))をダウンロード,インストールします。
※4/26追記 バージョン違いだったようです。最新版をインストールしてください。

e2studioの入手

e2studioをダウンロード,インストールしておきます。
KPIT GNU Toolsがインストール済みであれば,初めての起動の際に何か聞かれるので,Toolchainを登録しておきましょう。

プロジェクトの作り方

e2studioの使い方は省略します。
基本的にはルネサス公式のコンパイラを使う場合と同じように,新規C++プロジェクトを作成します。
ただし,利用するツールチェインを”KPIT GNURX-ELF Toolchain”にします。
その他はいい感じに設定を進めていきます。

C++11を使えるようにする

このままではC++98のままなので,C++11を使えるように設定しておきます。

メニューバーの「プロジェクト」->「プロパティ」を開き,
「C/C++ビルド」->「設定」を選びます。
「ツール設定」の中の「Compiler」->「その他」の画面で,
ユーザー定義オプションに”-std=c++11”を追加しておきましょう。
これでC++11が使えるようになります。

余談ですが,KPIT GNU ToolsはまだC++14に対応していないようです。

動かしてみて

動いた

時間が無く十分な検証ができていませんが,次のコードが正しく動作しました。

1
2
3
4
5
6
7
8
9
#include "iodefine.h"
#include <array>
using namespace std;
int main(){
array<int, 1> a = {123};
if(a.at(0) == 123) (LED点灯);
while(true);
return 0;
}

わからん

ビルドは通るし,プログラムも動作しているようですが,なぜか”-std=c++11フラグをつけるのならrx-elf-g++を使えよ!”という警告が出ます。
確かにrx-elf-gccで動かしているので,そりゃそうだと思ってコマンドをrx-elf-g++に変更するとコンパイルができなくなりました。

また,コンパイルは通っているのにe2studioのシンタックスチェックでシンボルが見つからないよ! というエラー表示が出てしまいます。
とりあえず動いているので問題はなさそうですが,うーん……

※4/26追記 シンタックスチェックを無効化すればいいとの意見をいただきました。
参考に設定方法を掲載しておきます。
Window>設定>C>コード解析 「シンボルが解決されません」「メソッドが解決されません」のチェックを外す

C++/C++11を始めよう

本を読んでください
としか言わないのは悲しいので,Miceでも使ってもらえそうな(とっつきの良さそうな)C++の新機能をリストアップします。
毎度のごとく,自分で詳しく調べなおしてください。

C++03

変数の定義位置

C言語でははじめに変数宣言をする必要がありましたが,C++では好きなところで変数宣言ができます。
すごく便利なのが次のコード

1
for (int i=0; i<100; ++i) hoge();

namespace

名前空間が使えます。
別の名前空間に属していれば,名前の重複が起こりません。
モジュールごとに名前空間を分けるようにすれば,命名力不足に悩まされる心配もありません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
namespace A{
int hoge = 0;
}
namespace B{
int hoge = 1;
}
int main(){
std::cout << hoge << endl; // hogeは存在しない
std::cout << A::hoge << endl; // 0
std::cout << B::hoge << endl; // 1
using namespace A;
std::cout << hoge << endl; // 0
}

vector

可変長配列です。
つまり配列の長さを自由に伸び縮みさせられる配列です。

1
2
3
4
5
6
7
8
#include <vector>
using namespace std;
int main(){
vector<int> hoge = {0, 1, 2};
hoge.at(1); //1
hoge.push_back(3);
hoge.at(3); //3
}

pair

これまでいちいち構造体で作っていたpairが標準で用意されるようになりました。

1
2
3
4
5
6
7
8
#include <utility>
using namespace std;
int main(){
pair<int, int> p1(10, 20);
p1.first + p1.second; // 30
pair<float, const char*> p2(1.3f, "abc");
return 0;
}

C++11

auto

自動型推論と呼ばれる機能です。
要するに型を”auto”としておけば自動でいい感じにしてくれます。

C流

1
2
3
4
5
6
7
8
9
#include <stdio.h>
void func(int t){
printf("Value: %d\n", t);
}
int main(){
void (*f)(int) = &func;
f(123);
return 0;
}

C++11流

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
void func(int t){
cout << "Value: " << t << endl;
}
int main(){
auto f = &func;
f(123);
return 0;
}

array

より安全に使える配列です。
あわせて,下のサンプルではrange-based forという技も使っています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <array>
using namespace std;
int main(){
array<int, 10> a = {};
for(auto ite = a.begin(); ite != a.end(); ++ite){
static int j = 0;
*ite = j++;
}
for(auto i: a){
cout << i << endl;
}
return 0;
}

enum class

C言語にも列挙型がありましたが,C++11で使い勝手が良くなりました。
列挙型のサイズを規定でき,スコープ演算子でアクセスするようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
using namespace std;
enum class N : unsigned char{
N1,
N2 = 100,
N3,
N4,
};
int main(){
N1; // 存在しない
N::N1; // 0
N::N4; // 102
return 0;
}

最後に

これだけでも十分便利そうなC++ですが,C++の底力はこんなもんじゃあないので,頑張って勉強していきたいところです。