Präprozessor-Angaben aus cc-Datei entfernen



  • Hallo,

    ich habe hier eine Datei mit C++-Quellen und möchte, dass sie soweit kompiliert wird, dass ich keinerlei Präprozessor-Direktiven mehr drin zu stehen habe.

    Mit dem Unix-Programm "gcc -save-temps pdftotext.cc" weden schonmal alle #include und #define-Direktiven aufgelöst und die entsprechenden Header-Dateien eingefügt. Die resultierende Datei "pdftotext.ii" enthält aber komischerweise noch Angaben wie:

    # 1 "pdftotext.cc"
    # 1 "<eingebaut>"
    # 1 "<Kommandozeile>"
    ...
    # 9 "pdftotext.cc"
    # 1 "./aconf.h" 1
    ...
    # 331 "/usr/include/features.h" 3 4
    # 1 "/usr/include/gnu/stubs.h" 1 3 4
    # 332 "/usr/include/features.h" 2 3 4
    # 29 "/usr/include/stdio.h" 2 3 4
    

    Und das verteilt in der ganzen Datei!

    Weiß jemand, wie ich die Quellen komplett von Lattenzäunden (#) befreie, ohne Funktionalität einzubüßen 😉 ?

    Danke im Voraus,
    Rapthor





  • Nachdem Du Deine Datei mittels 'cpp input.cpp output.temp' prozessiert hast, kannst Du die '#' Zeilen mit
    'grep -v "^#" output.temp > output.ii' saeubern. Bei einem kleinen Test hier waren die entsprechenden Zeilen fuer g++ nicht notwendig.



  • tim_g schrieb:

    Nachdem Du Deine Datei mittels 'cpp input.cpp output.temp' prozessiert hast, kannst Du die '#' Zeilen mit
    'grep -v "^#" output.temp > output.ii' saeubern. Bei einem kleinen Test hier waren die entsprechenden Zeilen fuer g++ nicht notwendig.

    Blöderweise wird eine Header-Datei beim Ausführen des Befehls "cpp input.cpp output.temp" nicht gefunden. Obwohl diese sich im gleichen Verzeichnis befindet.
    "cpp -B . input.cpp output.temp" funktioniert da auch nicht; ich dachte die Angabe des Arbeitsverzeichnisses müste ausreichen.



  • header.h:

    class Foo
    {
        int a, b;
        public:
        Foo(){};
    };
    

    test.cpp:

    #include <iostream>
    #include <string>
    
    #include "header.h"
    
    #define PI 42
    
    int main()
    {
        std::string pi ("PI");
    
        Foo f();
    
        std::cout << "PI = " << pi << std::endl;
    }
    

    cpp:

    cpp test.cpp test.ii
    

    funktioniert hier (Debian) ohne Probleme. Unter welchem System arbeitest Du? Hast Du die lokalen header mit "..." oder <...> umschlossen?



  • tim_g schrieb:

    Hast Du die lokalen header mit "..." oder <...> umschlossen?

    Daran lag's! Ich hatte fälschlicherweise "<..>" verwendet. Danke!



  • Die zusätzlichen Direktiven sind übrigens dafür da, dass der Compiler später noch sagen kann "Fehler in test.cpp:12" statt "Fehler in /tmp/gcccx45ae:12342" 😉


Anmelden zum Antworten