2016-07-11 17 views
1

In einem meiner letzten Projekte habe ich die Entwicklungsarbeit an Ubuntu (cmake + gcc 4.8.4) gemacht. Der Code baut gut auf. Wenn ich jedoch versuche, denselben Code in cygwin (cmake + gcc 5.3) zu erstellen, erhalte ich einen Compilerfehler für std :: bind. Dies geht weg auf eine #include <functional>. Das beunruhigt mich ein wenig. Ich erwarte, dass mein Code für identische oder sehr ähnliche Compiler funktioniert.std :: bind compiler fehler gcc

Ich habe gerade ein Stück Code verschickt, das auf einem CentOS verwendet wird. Ich nahm einfach an, dass, weil mein Code mit Ubuntu gut baut, andere Linux-Distributionen mit einem ähnlichen Compiler kein Problem sein sollten. Ich bin mir jedoch nicht mehr sicher, ob mein Code auf CentOS gut funktioniert.

Meine Frage ist dies. Kann ich davon ausgehen, dass, wenn mein Code mit einer bestimmten Version von gcc auf meinem Ubuntu-Rechner gut funktioniert, er auch auf anderen Linux-Distributionen mit derselben oder einer höheren Version von gcc gut funktioniert? Oder bin ich zu optimistisch und sollte mich auf mehr Tests verlassen? Oder hat das etwas mit std :: bind selbst zu tun?

+2

Die Funktion ['std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind) ist in der Standard-Header-Datei' ' deklariert. Nur weil Sie Glück haben, dass eine andere Header-Datei nur zufällig darin enthalten ist, bedeutet das nichts. Wenn Sie 'std :: bind' verwenden wollen, sollten Sie' 'explizit angeben. –

+1

Haben Sie Ihre Frage in der Frage nicht beantwortet? Ich bin verwirrt. –

Antwort

2

Wenn Sie vergessen haben, <functional> vor der Verwendung std::bind einzuschließen, ist Ihr Code nicht standardkonform und hat keine Garantie, überall zu arbeiten. Dass es bei deiner speziellen Toolchain funktioniert hat, ist ein unglückliches Glück.

+0

Aber wie könnte es jemals funktionieren ohne ''? – cplusplusrat

+1

@cplusplusrat eine andere Header, die Sie enthalten verwendet intern '' oder zumindest der Teil, der 'std :: bind' definiert. – Quentin

2

Meine Frage ist dies. Kann ich davon ausgehen, dass, wenn mein Code mit einer bestimmten Version von gcc auf meinem Ubuntu-Rechner gut funktioniert, er auch auf anderen Linux-Distributionen mit derselben oder einer höheren Version von gcc gut funktioniert?

Nein, Sie können nicht. Ihre Version hat möglicherweise einen Fehler, der das Kompilieren eines Stücks nicht konformen Codes ermöglicht, und die neuere Version könnte das behoben haben, was zu einem Compilerfehler für diesen fehlerhaften Code führen würde.

In der Tat ist das im Grunde, was dir passiert ist. Es ist nicht wirklich ein Fehler per se, aber Sie haben eine Funktion aus einem Standard-Header verwendet, und Sie haben diesen Header nie eingefügt. std::bind lebt in <functional>. Die Tatsache, dass es ohne die Einbeziehung von <functional> kompiliert wurde, ist nicht Standardverhalten. Wenn Sie zu einem Compiler übergegangen sind, der <functional> in einem der Header nicht eingeschlossen hat, schließen Sie die Kompilierung ein.

Oder bin ich übermäßig optimistisch und sollte mehr Tests verlassen?

Ja, Sie sollten den Code auf mehreren Compilern und Systemen testen, wenn Sie versuchen, wirklich tragbaren Code zu veröffentlichen. Ihre beste Verteidigung ist es, streng 100% standardkonformen Code zu schreiben.

Oder hat das etwas mit std :: bind selbst zu tun?

Das hat nichts mit std::bind zu tun, aber mit, wie Sie Sie Code machen. Nicht enthalten <functional>, wenn es erforderlich ist, macht Sie Code nicht konform.

+0

Ja, alle vernünftigen Vorschläge und Zeit zulässt, hätte ich einen viel strengeren Code Review gemacht. Seufz .... so ist das Leben. Lebe und lerne ... – cplusplusrat

+0

@cplusplusrat Ja. Aus unseren Fehlern lernen wir am häufigsten. – NathanOliver

+0

Raten Sie, eine verwandte Frage für mich ist das. Wie kann man jemals wissen, ob ein Code streng dem C++ 11-Standard folgt? Die Durchsetzung des C++ 11-Standards über Code-Reviews ist keine praktikable Lösung für ein nicht-triviales Projekt. Meine natürliche Antwort darauf ist Testen. Aber wie viele verschiedene Compiler und Versionen gibt es? Raten Sie, was ich frage ist, wie viel Tests würden Sie tun, wenn das Lesen der gesamten Codebasis keine Option ist, um sicherzustellen, dass Ihr Code streng dem C++ 11-Standard folgt? – cplusplusrat

3

Es gibt keine Garantie, dass alle gcc-Compiler-Versionen sich gleich verhalten. Insbesondere w.r.t. C++ 11 Features Es gab einige inkompatible Änderungen zwischen den Compiler-Versionen. gcc 4.8 hatte nur noch experimentelle C++ 11-Unterstützung. Der Standard besagt, dass std :: bind mit <functional> kommt, also gcc 5.3 richtig fordert Sie es sind: http://en.cppreference.com/w/cpp/utility/functional/bind

Es ist möglich, dass ältere Versionen von gcc entweder enthalten <functional> in einem anderen enthalten, die Sie haben, oder dass binden, wurde in anderen enthalten, zur Verfügung gestellt.

Es ist immer eine gute Idee, Software auf verschiedenen Compiler-Versionen und sogar mit einem komplett anderen Compiler (wie Clang) zu testen. Andernfalls könnten Sie Erweiterungen oder kleine Abweichungen vom C++ - Standard verwenden, ohne sie zu kennen und somit an diese bestimmte Compiler-Version gebunden zu sein.