ラベル gcc の投稿を表示しています。 すべての投稿を表示
ラベル gcc の投稿を表示しています。 すべての投稿を表示

2016年1月15日金曜日

[haskell][gcc][win] Windows版Haskell Platform付属のgccでC++11のコードをコンパイルする方法

Windows版のHaskell Platformにはmingwが同梱されておりgccが含まれています。現在自分のPCにはHaskell Platform 2014.2.0.0をインストールしているのですが、これに付属されているgccでC++11のコードをコンパイルしようとすると、以下のようなエラーになってしまいました。
% gcc -std=c++11 cpp11.cpp
cc1plus.exe: error: unrecognized command line option '-std=c++11'

-stdオプションで"c++11"を指定しても、認識してくれません。
本家のサイトによると、'-std=c++11'オプションはgcc 4.7でサポートされたようです。これに対し、Haskell Platform 2014.2.0.0に付属されているgccのバージョンを確認したところ、4.6であることがわかりました。
% gcc --version
gcc.exe (rubenvb-4.6.3) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gccは4.6で、'-std=c++11'オプションは認識できないバージョンであるため、冒頭のエラーとなってしまいます。
ただ、gcc4.6でもC++11(相当)コードをコンパイルする方法はあります。gcc 4.3~4.6では'-std=c++0x'と指定すれば。以下のように実行すればコンパイルすることができます。
% gcc -std=c++0x cpp11.cpp


参考:

2014年5月12日月曜日

[c++][gcc] constメンバ関数の中でメンバ変数を書き換えるには

C++において、一般的に定数宣言の目的で使用されるconst修飾子ですが、メンバ変数、メンバ関数、引数、返値にも宣言できることはご存知でしょうか。
適切に利用することで、以下のようなメリットが得られます。
  • API仕様がより明確になる
  • コードの可読性・メンテナンス性があがる

これらのメリットを享受すべくconst修飾子を積極的に利用していたのですが、まれにconstメンバ関数の中で、メンバ変数を書き換えたい、もしくは、メンバ変数の関数を呼び出したい、といったケースが発生したことがありました。
これまではconst関数の中でメンバ変数の値は参照のみで書き換えはできないと思っていたのですが「C++のためのAPIデザイン」という書籍を読みmutable修飾子が用意されていることを知りました。

const関数の中でメンバ変数を書き換えようとすると以下のようなエラーになります。

const_test.cpp: In member function 'void ConstTest::constFunc(int) const':
const_test.cpp:11:9: error: assignment of member 'ConstTest::m_val' in read-only object
   m_val = val;
         ^
const_test.cpp:12:23: error: passing 'const NotConst' as 'this' argument of 'void NotConst::normalFunc()' discards qualifiers [-fpermissive]
   m_normal.normalFunc();
                       ^
これは以下のコードをコンパイルしたときのエラーです(gcc 4.8.2)。
class NotConst
{
public:
 void normalFunc() /*const*/ {}
};
class ConstTest
{
public:
 void constFunc(int val) const
 {
  m_val = val;
  m_normal.normalFunc();
  return;
 }
private:
 /*mutable*/ int m_val;
 /*mutable*/ NotConst m_normal;
};
15行目と16行目でコメントアウトしているmutable修飾子を有効にすると、エラーなくコンパイルが通るようになります。mutable修飾子が付与されている変数を見かけたときには「const宣言されたオブジェクトでも変更されることがありますよ」と理解しましょう。

ちなみに後者のエラーは、NotConst::normalFunc()をconst関数に変更することでも修正が可能です。normalFunc()の仕様としてconst関数が適切なのであれば、mutable宣言を用いるのは避けてconst関数化すべきです。

2009年12月4日金曜日

リンクエラーの解決方法: undefined reference to `__gxx_personality_v0'

リンクエラーの解決方法: undefined reference to `__gxx_personality_v0'

gcc で C++ ソースをコンパイルしたとき上記のリンクエラーが発生することがあります。この関数はstack unwinding tableで利用するようです(例外関係の処理)。
このリンクエラーはlibstdc++(もしくは libsupc++:STLを含まない)をリンクすることで解決できます。

別のの解決法として、例外を使っていないのであれば、コンパイル時に "-fno-exceptions" オプションを指定することでも解決可能です。

参考: