Unexpected end while looking for precompiled header usw ...



  • Hallo,

    ich hab hier diesen eigentlich recht einfachen und, mit BCC55, auch funktionierenden Quellcode:

    #include <iostream.h>
    
    enum ERR_CODE { SUCCESS, ERROR };
    
    ERR_CODE Factor(int, int&, int&);
    
    int main()
    {
    	int number, squared, cubed;
    	ERR_CODE result;
    
    	cout << "Bitte eine Zahl eingeben (0 - 20): ";
    	cin >> number;
    
    	result = Factor(number, squared, cubed);
    
    	if(result == SUCCESS)
    	{
    		cout << "Zahl          : " << number << endl;
    		cout << "Quadrat       : " << squared << endl;
    		cout << "Dritte Potenz : " << cubed << endl;
    	}
    	else
    		cout << "Fehler! Die Zahl muss zwischen 0 und 20 liegen!\n";
    
    	return 0;
    }
    
    ERR_CODE Factor(int n, int &rSquared, int &rCubed)
    {
    	if(n > 20)
    		return ERROR;
    	else
    	{
    		rSquared = n * n;
    		rCubed = n * n * n;
    		return SUCCESS;
    	}
    }
    

    Wie gesagt, wenn ichs mit dem C++ Compiler von Borland kompiliere, gehts, mit MVC 6 geht nicht, da kommt o.g. Fehlermeldung. Ich hatte diesen Fehler schon recht oft, und noch keine allgemeingültige Lösung dafür gefunden. Hoffe ihr könnt mir dabei weiterhelfen 😉



  • Du hast in deinen Projekteinstellungen die Option 'use Precompiled Header'
    eingeschaltet.

    Entweder stellst du für dein cpp-File explicit ein, das es keine precompiled
    Header verwenden soll, oder du änderst das in den Projekteinstellungen für das
    gesamte Projekt, oder falls du die Anwendung mit dem Anwendungsassistenten
    erstellt hast und eine stdafx.h und stdafx.cpp hast mach folgendes:

    Ersetze das #include <iostream> durch #include "stdafx.h"

    Schreibe in der stdafx.h: #include <iostrem>

    Dann mußt du noch den namespace std bekanntmachen für cout, cin endl usw.

    Entweder in main.cpp durch: using namespace std; oder besser: using std:cout;
    und using std endl; und was du noch so brauchst.

    oder füge die Zeilen auch in der stdafx.h ein, damit sie global wirksam sind.



  • Danke schonmal, es klappt wenn ich es mache wie du gesagt hast 😉

    Allerdings stellen sich mir noch zwei Fragen: Wozu braucht man stdafx.h und wieso kommen 8 Errors wenn ich sie erst NACH iostream.h einbinde?
    also:

    #include "iostream.h"
    #include "stdafx.h"
    

    liefert 8 Errors mit dem obigen Quellcode, andersrum aber keinen 😉
    Woran liegt das?

    Danke schonmal im voraus



  • Also wie der Name schon sagt: precomiled = vorkompiliert.
    Das macht VS so, damit häufig benutzte header dateien nicht jedesmal kompiliert
    werden, wenn sie benötigt werden. Wenn du z.B. iostream in jeder cpp datei
    verwendest, muß der compiler jedesmal die iostream übersetzen. Ist sie in der
    stdafx.h wird sie jedoch nur einmal übersezt und nur wieder, falls sich in
    der iostream was ändern sollte. Da das ja nicht von dir implementiert ist,
    sollte es also nur einmal der Fall sein das der compiler diese datei übersetzt.
    Bindest du mehrere Dateien in der stdafx.h ein, wird also die stdafx.h nur neu
    übersetzt, falls sich eine der Dateien ändert.
    Im Prinzip reduziert es die Überstzungseit deines Programmes.

    Die Sache mit den Fehlern kann ich nicht genau beantworten, da du die Fehler
    nicht mitgepostet hast, aber merke: immer erst stdafx.h einbinden, dann die
    benötigten header wie z.B. bei einer Klasse.

    MyClass.cpp

    #include "stdafx.h"
    #include "myclass.h"
    
    MyClass::MyClass()
    {
       cout << "Konstruktor" << endl; // funktioniert weil iostream in stdafx.h!
    }
    
    MyClass::~MyClass()
    {
       cout << "Destruktor" << endl;
    }
    
    .
    .
    .
    .
    

    MyClass.h

    #pragma once
    
    class MyClass
    {
       MyClass();
       ~MyClass();
    };
    


  • Ahhh ich glaube nun hab ich einen Überblick 😉 Also ist stdafx.h quasi eine Sammlung von häufig benutzten Headern, damit man diese nicht automatisch mehrfach einbindet .....



  • jbmaier schrieb:

    ..., damit man diese nicht automatisch mehrfach einbindet .....

    Nein, es dient ausschließlich dazu, die Dauer des Kompilierens zu reduzieren. Die Fehler, die auftreten, wenn du stdafx.h nach iostream.h includest, kommen übrigens daher, dass bei der Verwendung von vorkompilierten Headern alles ignoriert wird, was vor der include-Direktive für die vorkompilierte Headerdatei steht.


Log in to reply