2016-07-11 18 views
1

私の最近のプロジェクトの1つでは、Ubuntu(cmake + gcc 4.8.4)の開発作業を行いました。コードはうまく構築されます。しかし、cygwin(cmake + gcc 5.3)で同じコードを作成しようとすると、std :: bindのコンパイラエラーが発生します。これは、を実行すると消えます。しかし、これは私を少し心配します。私は同じまたは非常に似たコンパイラで自分のコードがうまく動作することを期待しています。std :: bindコンパイルエラーgcc

CentOSで使用されるコードを出荷しました。私はちょうど私のコードはUbuntuでうまく構築されるので、同様のコンパイラを使った他のLinuxディストリビューションは問題ではないはずです。しかし、私のコードがCentOS上で正常に構築されるかどうかはもはや分かりません。

私の質問はこれです。自分のUbuntuマシン上でgccの特定のバージョンを使ってコードがうまく構築されていれば、同じバージョン以上のgccを持つ他のLinuxディストリビューションでもうまくいくと思いますか?あるいは、私は過度に楽観的で、より多くのテストに頼るべきですか?またはこれはstd :: bind自体と関係がありますか?

+2

['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind)関数は、標準ヘッダファイル' 'に宣言されています。他のヘッダーファイルが含まれているだけであれば、何も意味がありません。 'std :: bind'を使いたい場合は、明示的に' 'を含める必要があります。 –

+1

質問であなた自身の質問に答えなかったのですか?よくわかりません。 –

答えて

2

std::bindを使用する前に<functional>を含めるのを忘れた場合、コードは標準に準拠していないため、どこからでも動作する保証はありません。それがあなたの特定のツールチェーンで働いたことは不運な運です。

+0

しかし、それはどのように ' 'を含めないとうまくいくのですか? – cplusplusrat

+1

@cplusplusratあなたがインクルードした別のヘッダーには、内部で ''が使用されています。あるいは、少なくとも 'std :: bind'を定義する部分があります。 – Quentin

2

私の質問はこれです。自分のUbuntuマシン上でgccの特定のバージョンを使ってコードがうまく構築されていれば、同じバージョン以上のgccを持つ他のLinuxディストリビューションでもうまくいくと思いますか?

いいえできません。あなたのバージョンには、準拠していないコードをコンパイルすることを許可するバグがあったかもしれません。そして、それ以降のバージョンは、その厄介なコードのコンパイルエラーにつながる修正を持つ可能性があります。

実際これは基本的にあなたに起こったことです。実際にバグではありませんが、標準ヘッダーの関数を使用していて、そのヘッダーは決して含まれませんでした。 std::bind<functional>に住んでいます。 <functional>を含めることなくコンパイルしたという事実は非標準的な動作です。あなたが含まれているヘッダに<functional>が含まれていないコンパイラに移動すると、コンパイルが中断されました。

私は過度に楽観的であり、より多くのテストに頼るべきですか?

本当に移植性の高いコードをリリースしようとしている場合は、複数のコンパイラとシステムでコードをテストする必要があります。あなたの最善の防衛策は、厳密に100%標準に準拠したコードを書くことです。

これはstd :: bind自体と関係がありますか?

これはstd::bindとは関係ありませんが、コードをどのように準拠させるかによって異なります。 <functional>が含まれていない場合は、非適合コードになります。

+0

申し訳ありませんが、すべての合理的な提案と時間が許せば、私はずっと厳しいコードレビューをしたでしょう。一瞬....そんな人生です。生きて学ぶ... – cplusplusrat

+0

@cplusplusratうん。一般的に私たちの失敗から、私たちは最も多くを学びます。 – NathanOliver

+0

私には、これと関連する疑問があります。コードがC++ 11標準に厳密に従っているかどうかは、どのようにして知ることができますか?コードレビューによるC++ 11標準の適用は、自明ではないプロジェクトにとっては実現可能な解決策ではありません。ですから私の自然な答えはテストです。しかし、そこにはいくつの異なるコンパイラとバージョンがありますか?あなたのコードがC++ 11標準に厳密に従っていることを保証するために、コードベース全体を読むことは選択肢ではない場合、どのくらいのテストをしたいと思いますか? – cplusplusrat

3

すべてのgccコンパイラのバージョンが同じように動作する保証はありません。特にw.r.t. C++ 11の機能コンパイラのバージョンには互換性のないいくつかの変更がありました。 gcc 4.8にはまだ実験的なC++ 11のサポートしかありませんでした。標準では、std :: bindには<functional>がついていますので、gcc 5となります。図3は、正しく、あなたがそれを含めるように要求: http://en.cppreference.com/w/cpp/utility/functional/bind

他のいくつかの中のgccのいずれかに含ま<functional>の古いバージョンは、あなたが持っている含まれている可能性があり、またはそのバインドは別で提供されていたが含まれています。

ソフトウェアはさまざまなコンパイラバージョンでテストすることも、完全に異なるコンパイラ(clangなど)を使用することもできます。それ以外の場合は、C++標準の拡張機能や小さな偏差を知らずに使用することができます。そのため、特定のコンパイラバージョンに縛られます。

関連する問題