Вряд ли такой способ существует или будет встроен в clang (или любой другой компилятор C++) в будущее. Проблема заключается в том, что прекомпилированные заголовки используются для ускорения этапа компиляции, который обычно значительно дороже, чем шаг предварительной обработки. В результате, если вы собираетесь только предварительно обработать ваш источник, предварительно скомпилированный заголовок просто не будет использоваться. Один из способов, который имеет ничтожно малую вероятность получения того, что вы хотите использовать -include
вариант вместо опции -include-pch
(обратите внимание, что вы должны указать *.h
, а не *.pch
файла к нему):
clang main.cpp -include PrecompiledHeader.h -E
Гарантированных способ решения вашей проблемы заключается в трубу препроцессированного выхода через простую программу-фильтр, который смотрит на # line "file"
директивах и удаляет текст исходя из #include
ред файлов:
clang main.cpp -E|remove_included_code
remove_included_code
можно легко impleme nted в питона, Баш, C/C++ и т.д. Вот реализация C++ (C++ был выбран так, чтобы его можно было легче всего использовать под Windows):
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;
}
Преимуществом этого решения является то, что он будет работать со всеми компиляторами.
«Я бы хотел получить только основную функцию, и содержимое PrecompiledHeader.h будет исключено из вывода». Это неясно. Если вы опустите (просто) содержимое 'PrecompiledHeader.h', вы получите основную функцию * плюс * содержимое' stdio.h'. –