2017-08-20 1 views
1

Ich möchte nur Include-Direktiven einer C-Datei meines Arbeitsverzeichnisses erweitern; nicht das Systemverzeichnis.Wie man eine C-Datei mit einem bestimmten Arbeitsverzeichnis teilweise vorverarbeitet

Ich habe versucht, die folgenden:

gcc -E -nostdinc -I./ input.c 

Aber es stoppt Vorverarbeitung, wenn es die mitgelieferten System-Header in input.c zu finden, fehlschlägt. Ich möchte, dass es die include-Direktive kopiert, wenn sie es nicht findet und die Datei vorverarbeitet.

+0

, um die Lösung Does [Wie führe ich den Präprozessor auf lokale Header nur?] (Https://stackoverflow.com/questions/20889460 /) Hilfe? Es ist eine Antwort auf eine C++ - Frage, aber die Ideen (und Skripte) arbeiten auch direkt mit C-Code. –

+0

Meine eigene Lösung [unten] (https://Stackoverflow.com/a/45786694/7392560) ist viel einfacher, da ich keine leeren Dateien usw. erstellen muss. –

+0

Ja, wenn Sie Haskell auf Ihrem Computer installiert haben, oder Sie finden eine vordefinierte Kopie, dann ist es besser, 'cpphs' zu verwenden. –

Antwort

1

fand ich eine utility das genau das tut, was ich suchte:

$ cpphs --nowarn --nomacro -I./ input.c | sed -E 's|#line 1 "missing file: (.*)"|#include <\1>|' 
1

Wenn Ihre input.c Datei einige Systemheader enthält, ist es normal, dass der Präprozessor abstürzt, wenn er sie nicht finden kann.

Sie könnten ersten grep -v verwenden, um all #include von System-Header in Ihrem Code zu entfernen, so etwas wie dieses Ziel zu erreichen (Liste ist nicht abschließend):

grep -vE "(stdio|stdlib)\.h" code.c > code_.c 

Sie zum Beispiel erhalten:

#define EXITCODE 0 
int main(){ 
    int i = EOF; 
    printf("hello\n"); 
    return EXITCODE; 
} 

dann Vorprozess:

S:\c>gcc -E code_.c 
# 1 "code_.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "code_.c" 

int main(){ 
    int i = EOF; 
    printf("hello\n"); 
    return 0; 
} 

zur Kenntnis, dass der prä- Der Prozessor kümmert sich nicht um nicht definierte Funktionen oder Makros. Sie erhalten Ihren Code vorverarbeitet (und Ihre Makros erweitert), nicht die systemeigenen.

Sie müssen natürlich auch alle enthaltenen Dateien verarbeiten. Das bedeutet eine zusätzliche Schicht von Werkzeugen, um temporäre Quelldateien zu erstellen und von dort aus zu arbeiten.

+0

Ja natürlich, danke! –

Verwandte Themen