Include Hack



  • Tag zusammen,

    als ich damals vor langer Zeit C++ gelernt habe, da hieß es, dass #include ein Präprozessor Befehl ist, der nur eine stupide Textersetzung vornimmt. Nämlich den Inhalt der angegebenen Datei anstelle des includes zu "schreiben".

    Bisher war ich mit meinem Projekt in Visual Studio 2012 und auch 2013 unterwegs und ich habe folgendes Konstrukt:
    Version.txt

    "12.3.2"
    

    Code.cpp

    #include <string>
    #include <iostream>
    
    int main()
    {
        std::string s = 
    #include "Version.txt"
        ;
    
        std::cout << s << std::endl; // sollte 12.3.2 rauskommen
    }
    

    Und bisher klappte das auch gut.

    Nun bin ich eben auf die neue 2015er Version vom Visual Studio aufgesprungen und das erste was der mir sagt, ist dass meine Datei Version.txt ein unerwartetes Dateiende hat (C1004).

    Mache ich was falsch(hab ich vielleicht eine dumme Option de-/aktiviert?) oder is der MSVC da doof?

    Edit: Syntax 😉



  • Schuss ins Blaue: Leerzeile ans ende von Version.txt einfügen.
    Und Syntax in deinem Demobeispiel fixen 😉



  • schau dir das mal an:
    https://msdn.microsoft.com/de-de/library/4exw7xyc.aspx
    http://stackoverflow.com/questions/9978549/fatal-error-c1004-unexpected-end-of-file-found

    ich weiß es nicht genau und kanns leider gerade nicht testen, aber klingt so als ob dir i.ein endzeichen fehlt -> C1004

    würde auf anhieb mal versuchen vll ein ";" hinter den text - im #include zu machen...

    hoff ich konnte helfen 🙂
    lg



  • Shade Of Mine schrieb:

    Schuss ins Blaue: Leerzeile ans ende von Version.txt einfügen.

    Ja okay, das hat geholfen.

    Wie kamst du da drauf?



  • Skym0sh0 schrieb:

    Wie kamst du da drauf?

    Wahrscheinlich hat er sich erinnert, wie er mal "C1004" gegooglet hat und https://msdn.microsoft.com/en-us/library/4exw7xyc.aspx u.a. sagte:

    To resolve this error, check for the following:

    • A source file does not end with a carriage return and line feed.


  • Wäre auch ohne googeln mein erster Tip gewesen. POSIX definiert Zeilen über das abschließende \n am Ende. Ich nehme stark an, dass der C-Standard das dementsprechend ähnlich sieht.



  • Ja das habe ich gesehen, aber ein Leerzeichen ist für mich kein Line-Feed und auch kein Wagenrücklauf.

    Mein nächster Fehler war übrigens eine ganze Reihe von Linker Errors, weil ich angeblich meien Symbole mehrfach definiert hätte.

    Hat sich rausgestellt, dass Microsoft die /Za Option nicht mag und kaum supportet..... 😞



  • Du brauchst doch auch kein Leerzeichen, sondern nur einen Zeilenumbruch als letztes Zeichen deiner Datei.

    Also unter Unix das, was ein printf("\"12.3.2\"\n"); ausspuckt.



  • Skym0sh0 schrieb:

    Hat sich rausgestellt, dass Microsoft die /Za Option nicht mag und kaum supportet..... 😞

    /Za funktioniert prinzipiell schon, die Windows-header gehen damit aber nicht. Das begründet Microsoft damit, dass man die eh nicht platformunabhängig kompilieren kann, also macht /Za dafür keinen Sinn und ist für MS-Entwickler völlig unnötige Arbeit das kompatibel zu machen.

    Du kannst aber /Za individuell für einzelne .cpp Dateien anmachen, die nicht kompatiblen header nur in wenigen source files verwenden und ohne /Za kompilieren, während der großteil deines Codes mit /Za kompiliert. Dazu ist natürlich eine klare Trennung des Platformabhängigen vom Platformunabhängigen Teil nötig, aber das solltest du ja sowieso haben.



  • Jop, hab ich auch. Lustigerweise benutze ich die platformabhängigen Windows Files nicht. Fehler kriege ich bei Standarddingen wie limits (alles aus std::numeric_limits wirft Linker Fehler).

    /Za ausgemacht, alles läuft. bzw compilt und linkt.

    Stephan T. Lavavaj schrieb:

    We recommend against using /Za, which is best thought of as "enable extra conformance and extra compiler bugs", because it activates rarely-used and rarely-tested codepaths. I stopped testing the STL with /Za years ago, when it broke perfectly conformant code like vector<unique_ptr<T>>. That compiler bug was later fixed, but I haven't found the time to go re-enable that /Za test coverage. Implementing missing features and fixing bugs affecting all users has been higher priority than supporting this discouraged and rarely-used compiler option.

    (aus Quelle, einer der Kommentare unten)



  • nman schrieb:

    Wäre auch ohne googeln mein erster Tip gewesen. POSIX definiert Zeilen über das abschließende \n am Ende. Ich nehme stark an, dass der C-Standard das dementsprechend ähnlich sieht.

    👍 exakt


Log in to reply