mcommit's message

大阪でソフトウェア開発の仕事をしている simotinといいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

何があっても、C++11を見て、ただC++11を見て、進みたいと思います ~Anonymous様からコメント頂きました~

先日、C++が嫌いだ
mcommit.hatenadiary.com
という記事を書いたらAnonymous様からコメントを頂きました。

せっかくコメント頂いたのでお返事となるような記事を書いておきたいと思います。

Anonymous様、コメント頂きましてありがとうございました!
記事にも書いていますが「個人的な不満のはけ口」として思ったことを冗談めかして書いているだけですのでご容赦ください。
当然、決して誰かを傷つけるという意図で書いたり公開しているものでもありません。
※Anonymous様のお気持ちを傷つけてしまったのでしたら申し訳ありませんでした。
ご指摘の通り感情的になって書いておますが、特に誰かのために書いた文章ではなく自己満足として書いた記事ですので。


さていろいろ調べてみると、C++11では便利な機能が追加されていたので私の知っているC++とは随分様相が変わっておりました。
少し勉強してみて、C++11の機能を使った簡単なコードを書いてみました。

// main.cpp
// encoding:utf-8

#include <iostream>
#include <sstream>
#include <string>
#include <random>

unsigned char code[] = {0x43, 0x2B, 0x2B, 0x20, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x89, 0x20, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x84, 0xE3, 0x81, 0x8F, 0xE9, 0x80, 0x83, 0xE3, 0x81, 0x92, 0xE3, 0x81, 0xA6};
using namespace std;
int main(int argc, char **argv) {
	stringstream ss;
	int i;
	random_device rnd;

	while(true) {
		i = rnd() % 8;
		cout << "\e[";
		ss << (30 + i);
		cout << ss.str() + ";";
		ss.str("");
		ss.clear(stringstream::goodbit);
		i = rnd() % 8;
		ss << (40 + i);
		cout << ss.str() + ";5m";
		ss.str("");
 		ss.clear(stringstream::goodbit);
		cout << code;
		cout << "\e[m";

	}
	return 0;
}

GCCでのビルドは、g++ --std=c++11とする必要がある

冗談はコードだけにしておいて、上記のコードだとc++11では「数値」→「文字列変換」には、to_stringメソッドが提供されていますが、残念ながら私の環境


g++ -v

組み込み spec を使用しています。
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/4.9.3/lto-wrapper.exe
ターゲット: x86_64-pc-cygwin
configure 設定: /cygdrive/i/szsz/tmpp/gcc/gcc-4.9.3-1.x86_64/src/gcc-4.9.3/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-4.9.3-1.x86_64/src/gcc-4.9.3 --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-tune=generic --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-graphite --enable-threads=posix --enable-libatomic --enable-libgomp --disable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --enable-libada --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id
スレッドモデル: posix
gcc バージョン 4.9.3 (GCC)

では動きませんでした。
c++11の機能の実装はコンパイラによってできていたりいなかったりというのが実情なのかもしれません。

[追記]
コメントでegtra様(egtraさんのプロフィール - はてな)が原因を教え下さいました。cygwinGCCでは(Clangも)標準ライブラリにglibcが使われていないためto_stringは使えないそうです。egtra様ありがとうございました。


実務のレベルでもC++11が便利なのは知っているけど実際には過去のしがらみなどもあって使っていないというプロジェクトも多いのかもしれませんが、実際のところどこまで使われているのかが気になります。
g++を除くと私が知っているC++コンパイラは,Clang,VisualC++だけですが、コンパイラベンダーがC++11の仕様をどこまで律儀に実装できるかが気になるところです。

組み込み系では(不要な不具合の発生を恐れて)コンパイラのバージョンアップや実績のないライブラリの採用を嫌がるのですぐにはC++11を使ったコーディングは普及しないかもしれません。