2017-05-30 1 views
1

Während für die besten pratices Suche in Bezug auf Ordnung sind, war ich über diesen Thread stolpert:Fügen Sie Ordnung und versteckte Abhängigkeiten

C/C++ include file order/best practices [closed]

@squelart wurde die besagt, dass es besser pratice von lokal bis global schließen ist, da dies die Wahrscheinlichkeit versteckter Abhängigkeiten verringert.

StrTest.h

#pragma once 

class CStrTest 
{ 
    public: 
     CStrTest(); 
     ~CStrTest(); 

     std::string test; 
}; 

StrTest.cpp

#include <string> 
#include "StrTest.h" 


CStrTest::CStrTest() 
{ 
} 

CStrTest::~CStrTest() 
{ 
} 

Ich konnte nicht reproduzieren die angegebene Verhalten (versteckte dependencie Duo einschließlich: ich dies nur mit dem folgenden Code in einem VS2015-Projekt getestet String zuerst in StrTest.cpp). Der Compiler gibt mir mehrere Fehler. Ist das etwas aus der Vergangenheit oder habe ich etwas übersehen?

EDIT: VS2015 Compiler-Fehler:

Fehler C4430 fehlende Typspezifizierer - int angenommen. Hinweis: C++ nicht unterstützt default-int

Fehler C2039 'string': kein Mitglied von 'std' ist

Fehler C3646 'test': unbekannt Überschreibung Spezifizierer

+0

Es ist unklar, was Sie hier fragen - der obige Code kompiliert. –

+1

Sie tun tatsächlich das Gegenteil von dem, was die quälende Antwort vorgeschlagen hat. – VTT

+1

Sie müssen auch "std :: string" in "StrTest.h" angeben oder zumindest weiterleiten. Ihre Header-Dateien sollten eigenständig sein. – juanchopanza

Antwort

1

So ist dieses etwas aus der Vergangenheit

Nein, die versteckten Abhängigkeiten sind das Standardverhalten und passieren in modernen Compilern. Ich kenne VS nicht, aber GCC und Clang kompilieren dein gezeigtes Programm ohne irgendwelche Fehler. Demo: https://wandbox.org/permlink/ATJndwrOwirpDgDd

Der Compiler gibt mir mehrere Fehler.

Obwohl ein „implizite“ enthalten ist schlecht Stil, es so weit noch technisch gut ausgebildet ist als der Standard so lange betroffen als die implizit enthaltene Datei von Ihnen aufgenommen werden garantiert oder wer schrieb den Header, die folgenden beinhaltet Es - Standard-Header haben keine solchen Garantien.

Daher würde ich gegen solche Compiler-Feature sein, die implizite umfasst als Fehler berücksichtigt. Eine explizit aktivierbare Warnung wäre viel geeigneter.

+0

Danke, ich habe das nicht mit anderen Compilern getestet. Es ist interessant zu sehen, dass dies mit GCC und Clang funktioniert. – YokeM

0

Ich denke, der Punkt der versteckten Abhängigkeit Problem dort ist, dass in der Regel jede Datei mehrere andere Dateien enthält und wenn Header nicht in sich geschlossen ist dann kann es in Fällen, wenn es implizit Abhängigkeiten von einer anderen Header und Pause enthalten sind alles, wenn sich diese anderen Header ändern und/oder verschoben werden. Kurz gesagt: die Verwendung von Headern mit versteckten Abhängigkeiten führt zu extrem fragilem Code.

// foo.hpp 
#pragma once 

#include <string> // if we remove this unrelated `StrTest.h` header will be broken 
... 

.

// main.cpp 

#include "foo.hpp" // if we move this one line lower `StrTest.h` header will be broken 
#include "StrTest.h" // accidentally works fine 
... 
Verwandte Themen