Fehler beim Suchen von einer corkompilierten Header-Datei



  • Ich fange gerade an mich in die Windows-Programmierung einzuarbeiten, und verwende
    für meine Programme Ms Visual C++ 6.0 AutorenVersion.
    Ich wollte folgendes Programm aus dem Petzold compilieren:

    /* ScrnSize.cpp - Zeigt die Bildschirmgröße in einem Meldungsfenster an */
    
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    int CDECL MessageBoxPrintf (TCHAR *szCaption, TCHAR *szFormat, ...) {
    
    	TCHAR szBuffer[1024];
    	va_list pArgList;
    
    	// Das in STDARG.H definierte Makro va_start entspricht:
    	// pArgList = (char *) &szFormat + sizeof (szFormat);
    	va_start (pArgList, szFormat);
    
    	// Der letzte Parameter von wvsprintf zeigt auf die Parameter
    	_vsntprintf (szBuffer, sizeof (szBuffer)/sizeof (TCHAR), szFormat, pArgList);
    
    	// va_end tut nichts weiter, als pArgList auf NULL zu setzen
    	va_end (pArgList);
    
    	return MessageBox (NULL, szBuffer, szCaption, 0);
    
    }
    
    int WINAPI WinMain (HINSTANCE hInstace, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    
    	int cxScreen, cyScreen;
    
    	cxScreen = GetSystemMetrics (SM_CXSCREEN);
    	cyScreen = GetSystemMetrics (SM_CYSCREEN);
    
    	MessageBoxPrintf (TEXT ("ScrnSize"), TEXT ("Ihr Desktop hat eine Höhe von %i und eine Breite
    						von %i Pixeln"), cxScreen, cyScreen);
    
    	return 0;
    
    }
    

    Bekomme aber folgenden Fehler:

    Kompilierung läuft...
    ScrnSize.cpp
    e:\sources\c\winapi\scrnsize\scrnsize.cpp(39) : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei
    Fehler beim Ausführen von cl.exe.

    ScrnSize.exe - 1 Fehler, 0 Warnung(en)

    Leider weiß ich mir beim besten Willen nicht zu helfen 😞

    Wofür steht eigentlich bei den Funktionen int WINAPI WinMain (); dieses WinAPI
    ich habe bisher noch nie so etwas gesehen (hab nur für die Konsole programmiert)
    da sehen die Funktionen normal so aus int main ();

    Edit:
    Noch etwas, wie kann ich die Zeilenzahlen einschalten?



  • du musst in die cpp datei noch die stdafx.h includieren.

    Devil



  • Das ändert leider auch nichts und im Petzold wird die auch nicht verwendet.



  • devil hat recht... das steht im petzold nur nich drin weil der seine programme nich mit dem assistenten erstellt 😉



  • Danke, jetzt klappt es, hatte ausversehen stdfax statt stdafx geschrieben.
    Könntet ihr mir noch meine 2. und 3. Frage beantworten?
    Und wofür ist die stdafx.h gut bzw. was steht da drin?



  • is nur ne konfigurationsdatei in der der assistent alle nötige einstellt/einbindet



  • @Sovok: nicht ganz 😉

    "Vorkompilierte Header" beschleunigen die Übersetzung. Dazu sollte stdafx.h Header_Dateien einbinden, die in den meisten Projektdateien vorhanden sind und sich nicht (oder nur selten) verändern.

    Hintergrund:
    Wenn ein C++-Programm übersetzt wird, nimmt der Compiler sich jede CPP-Datei einzeln vor, und übersetzt das, was drin steht. der Linker bindet dann die "Ergebnisse" jeder .cpp - Datei zu einer .exe (oder .dll oder was auch immer) zusammen. #include's funktionieren dabei wie reiner Textersatz.

    Wenn man mit größeren Bibliotheken (z.B. der WinAPI oder der MFC) arbeitet, müssen für jede .cpp-Datei eine Menge Header-Dateien abgearbeitet werden. Um das zu beschleunigen, gibt es vorkompilierte Header: Der Compiler merkt sich die kompletten Symboltabellen der Header-Dateien, und muß die #includes nicht wiederholt abarbeiten. Das geht natürlich nur, wenn die Header in der gleichen Reihenfolge (und mit absolut identischen voranstehenden Deklarationen, #defines usw.) #includiert werden.

    Diese Symboltabellen werden aber ziemlich groß (.pch bei C++, ein paar MB für ein Windows/MFC - Projekt), von daher sind dem vorkompilieren Mengengrenzen gesetzt.

    Visual C++ macht nun (mit den Assistenten-Standardeinstellungen) folgendes:

    - in stdafx.h kommen alle header, die vorzukompilieren sind
    - In den projekteinstellungen wird für stdafx.cpp "vorkompilierte header aus dieser Datei erstellen" gesetzt
    - Für alle .cpp anderen Dateien (und als default für neue) wird "vorkompilierte Header aus stdafx.h verwenden" gesetzt
    - Beim Übersetzen wird als erstes stdafx.cpp übersetzt (natürlich nur wenn die .pch fehlt oder sich etwas geändert hat)
    dabei wird die .pch - Datei erzeugt
    - bei allen anderen .cpp dateien für die "votrkompilierte header verwenden" eingestellt ist, wird nach dem ersten auftauchen
    von #include "stdafx.h" (oder dem entsprechenden header) gesucht. Wenn es gefunden wird, wird die .pch-Symboltabelle "angenommen" und weiter
    übersetzt

    ACHTUNG: zumindest VC6 ignoriert z.B. #defines vor dem #include "stdafx.h" völlig!

    Da damit stdafx.h als allerersteDatei in allen .cpp - Dateien #includiert werden muß, ist es auch ein bequemer Platz um globale Projektdefinitionen unterzubringen.



  • Vielen Dank, dann macht diese Datei auch Sinn 🙂

    Könntet ihr mir noch folgendes beantworten:

    Wofür steht eigentlich bei den Funktionen int WINAPI WinMain (); dieses WinAPI
    ich habe bisher noch nie so etwas gesehen (hab nur für die Konsole programmiert)
    da sehen die Funktionen normal so aus int main ();

    Noch etwas, wie kann ich die Zeilenzahlen einschalten?



  • rechtsklick auf das wort->gehe zu definition von ...

    -> #define WINAPI __stdcall



  • In der Statusleiste hast du Zeilen und Spaltenanzeige.



  • estartu_de schrieb:

    In der Statusleiste hast du Zeilen und Spaltenanzeige.

    Heißt das, dass ich niemals direkt in eine Zeile 153 gehen kann ohne auf jede Zeile
    zu klicken und schauen wie weit ich bin?
    Die werden für den schmalen Rand neben dem weißen Blatt doch wo eine Option haben
    um Zeilennummern einzublenden, das kann doch wirklich jeder richtige Editor oder
    jede IDE



  • strg+g -> nummer eingeben



  • Gibt es in neueren Versionen, Zeilennummern?
    Sonst muss ich es mir doch mal gründlich überlegen ob ich mir nicht lieber
    den BCB hole(hoffe der hat sowas, weiß das wer?).



  • Visual Studio .NET kann Zeilennummern anzeigen.



  • @SirLant
    Ich weiß ja nicht, wofür du's brauchst, aber Zeilennummernanzeige ist m.E. ein sehr schwaches Kriterium. An Compiler-Fehler usw. kommst du mit doppelklick oder F4 ran, für externe Tools kannst du das oft ähnlich einstellen, und wenn du mal auf eine Zeile springen mußt - Ctrl-G (selbst das brauch ich selten...)



  • Finde es einfacher, da ich so schnell durchscrollen kann, aber wenn die neuen
    Versionen das haben ist es eh kein Thema für mich.


Log in to reply