Kaum ein solcher Weg existiert oder wird in Clang (oder einem anderen C++ Compiler) in der gebaut werden Zukunft. Das Problem besteht darin, dass vorkompilierte Header verwendet werden, um den Kompilierungsschritt zu beschleunigen, der normalerweise wesentlich teurer ist als der Vorverarbeitungsschritt. Wenn Sie Ihre Quelle nur vorverarbeiten, wird der vorkompilierte Header einfach nicht verwendet. Eine Möglichkeit, dass eine vernachlässigbar kleine Chance zu produzieren hat, was Sie wollen, ist die -include
Option verwenden anstelle der -include-pch
Option (beachten Sie, dass Sie die *.h
angeben müssen, anstatt die *.pch
Datei, um es):
clang main.cpp -include PrecompiledHeader.h -E
Das garantiert Weg, um Ihr Problem zu lösen, ist die Präprozessorausgabe durch ein einfaches Filterprogramm zu Rohr, das an den # line "file"
Richtlinien sieht und entfernt Text aus #include
ed Dateien kommen:
clang main.cpp -E|remove_included_code
remove_included_code
lässt sich leicht DURCHFÜHRU nted in Python, Bash, C/C++, usw. Hier ist eine C++ Implementierung (C++ wurde so gewählt, dass es am einfachsten unter Windows verwendet werden kann):
remove_included_code.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
typedef std::string Str;
bool isLineDirective(const Str& line)
{
return line.size() >= 3
&& line[0] == '#'
&& line[1] == ' '
&& isdigit(line[2]);
}
Str getFile(const Str& line)
{
const Str::size_type start = line.find_first_of('"') + 1;
const Str::size_type end = line.find_first_of('"', start);
return line.substr(start, end - start);
}
int main()
{
Str line;
getline(cin, line);
if (!isLineDirective(line)) {
cerr << "Error: Input must start with a '# line \"file\"' directive\n";
exit(1);
}
const Str startFile = getFile(line);
Str currentFile = startFile;
while (getline(cin, line)) {
if (isLineDirective(line))
currentFile = getFile(line);
else if (currentFile == startFile)
cout << line << endl;
}
return 0;
}
Die Vorteil dieser Lösung ist, dass sie mit allen Compilern funktioniert.
"Ich möchte nur die Hauptfunktion erhalten und den Inhalt von PrecompiledHeader.h aus der Ausgabe weggelassen haben." Das ist unklar. Wenn Sie (nur) den Inhalt von 'PrecompiledHeader.h' weglassen, erhalten Sie die Hauptfunktion * plus * den Inhalt von' stdio.h'. –