Brauchen Sie eine Header-Datei, die undefs alle in Windows.h definiert

9
___ answer11489018 ___

Anstatt alles zu offenbaren, vermeide es, sie zu definieren. Sie können dies tun, indem Sie den ersten Teil Ihres Moduls (als separate Quelldatei) explizit durch den Präprozessor übergeben und den Präprozessorausgabe anstelle des ursprünglichen Quellcodes in der Hauptquelldatei Ihres Moduls.

Ich habe das mit Visual Studio 2010 ausprobiert. Für meine Testversion habe ich drei Quelldateien erstellt. Dies ist headers.cpp, analog zum ersten Teil Ihres Beispielcodes:

%Vor%

#undef verhindert die Einbindung von windows.h , da diese Datei Fehler erzeugt, wenn sie aus einem Namespace eingefügt wird.

Dies ist xyzzy.h, um zu demonstrieren, dass "eine Reihe von Dateien hier enthalten" aus Ihrem Beispielcode:

%Vor%

Und das ist test.cpp, analog zum "all clean" Teil Ihres Beispielcodes:

%Vor%

Beachten Sie, dass wir UNALIGNED als Variablennamen verwenden, nicht weil es sinnvoll ist, sondern nur als Beispiel für etwas, das nicht funktioniert, wenn Sie %code% direkt eingefügt haben (weil es auf das nicht zugeordnete Schlüsselwort erweitert wird) ).

Erstellen Sie in einer Visual Studio 2010-Befehlszeile %code% wie folgt:

%Vor%

Die Option / P ist hier dokumentiert .

Sie können dann %code% auf die übliche Weise kompilieren:

%Vor%

(Offensichtlich wird das Programm in diesem Fall nicht verlinken, weil wir myFunction nicht definiert haben, aber es kompiliert perfekt glücklich.)

Mit ein bisschen herumfummeln sollte es nicht zu schwer sein das Build von %code% zu automatisieren, anstatt es von der Kommandozeile aus zu machen.

In einigen C ++ - Compilern ist der Präprozessor tatsächlich eine separate ausführbare Datei (dies war das traditionelle Modell), aber falls nicht, sollte es immer noch eine Option geben, die den Präprozessor nur ausführt, ohne den Compiler aufzurufen.

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123winapi ___ Die Windows-API (früher als Win32-API bezeichnet) ist der Kernsatz von Anwendungsprogrammierschnittstellen, die für die Microsoft Windows-Betriebssysteme verfügbar sind. Mit diesem Tag können Sie Fragen zur Entwicklung nativer Windows-Anwendungen mit der Windows-API beantworten. ___ qstnhdr ___ Brauchen Sie eine Header-Datei, die undefs alle in Windows.h definiert ___ tag123windows ___ ALLGEMEINER WINDOWS-SUPPORT IST OFF-TOPIC. Support-Fragen können unter https://superuser.com gestellt werden. Windows ist ein von Microsoft entwickeltes Betriebssystem. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Verwendung von Windows-APIs oder Windows-spezifischem Verhalten in Bezug auf Ihren Code bezieht, nicht nur, weil Sie Ihren Code unter Windows ausführen. ___
defube 14.07.2012, 22:29
quelle

1 Antwort

2

Anstatt alles zu offenbaren, vermeide es, sie zu definieren. Sie können dies tun, indem Sie den ersten Teil Ihres Moduls (als separate Quelldatei) explizit durch den Präprozessor übergeben und den Präprozessorausgabe anstelle des ursprünglichen Quellcodes in der Hauptquelldatei Ihres Moduls.

Ich habe das mit Visual Studio 2010 ausprobiert. Für meine Testversion habe ich drei Quelldateien erstellt. Dies ist headers.cpp, analog zum ersten Teil Ihres Beispielcodes:

%Vor%

#undef _MSC_EXTENSIONS verhindert die Einbindung von sourceannotations.h , da diese Datei Fehler erzeugt, wenn sie aus einem Namespace eingefügt wird.

Dies ist xyzzy.h, um zu demonstrieren, dass "eine Reihe von Dateien hier enthalten" aus Ihrem Beispielcode:

%Vor%

Und das ist test.cpp, analog zum "all clean" Teil Ihres Beispielcodes:

%Vor%

Beachten Sie, dass wir UNALIGNED als Variablennamen verwenden, nicht weil es sinnvoll ist, sondern nur als Beispiel für etwas, das nicht funktioniert, wenn Sie windows.h direkt eingefügt haben (weil es auf das nicht zugeordnete Schlüsselwort erweitert wird) ).

Erstellen Sie in einer Visual Studio 2010-Befehlszeile headers.h wie folgt:

%Vor%

Die Option / P ist hier dokumentiert .

Sie können dann test.cpp auf die übliche Weise kompilieren:

%Vor%

(Offensichtlich wird das Programm in diesem Fall nicht verlinken, weil wir myFunction nicht definiert haben, aber es kompiliert perfekt glücklich.)

Mit ein bisschen herumfummeln sollte es nicht zu schwer sein das Build von headers.h zu automatisieren, anstatt es von der Kommandozeile aus zu machen.

In einigen C ++ - Compilern ist der Präprozessor tatsächlich eine separate ausführbare Datei (dies war das traditionelle Modell), aber falls nicht, sollte es immer noch eine Option geben, die den Präprozessor nur ausführt, ohne den Compiler aufzurufen.

    
Harry Johnston 15.07.2012, 02:53
quelle

Tags und Links