Compilerfehler: Neue Deklaration macht alte Deklaration mehrdeutig



  • Hallo @all,

    ich möchte gerne C++ lernen und habe mir deshalb das Buch von Prinz/Prinz "C++ lernen und professionell anwenden" gekauft. Nun bin ich schon bei Aufgabe 3 😉 und habe ein kleines Problem. Ich habe diesen Beispielcode Zeile für Zeile abgetippt, aber beim Compilieren bekomme ich eine Fehlermeldung.

    #include <iostream>
    using namespace std;
    
    void pause();	// Prototyp
    
    int main()
    {
    	cout << endl << "Lieber Leser, "
    	<< endl << "goennen Sie"
    	<< " sich jetzt eine ";
    
    	pause();
    	cout << "!" << endl;
    
    	return 0;
    }
    
    void pause()
    {
    	cout << "PAUSE";
    }
    

    Ich übersetze also mit

    g++ aufgabe03.cpp -o aufgabe03
    

    und es kommt dann diese Fehlermeldung:

    aufgabe03.cpp:4: Fehler: neue Deklaration »void pause()«
    /usr/include/unistd.h:429: Fehler: macht alte Deklaration »int pause()« mehrdeutig
    

    Ich habe schon ausprobiert die Funktion einfach in "paeuschen" umzubenennen, da klappt es dann auch mit der Ausfuehrung, aber es würde mich interessieren, warum es dann mit dem Namen "pause" nicht funktioniert.

    Ich würde mich freuen, wenn mir jemand weiterhelfen könnte.

    Vielen Dank!

    Greetz
    Polluxx



  • Liegt zum einen an deinem Compiler und zum anderen daran das du den Namespace aufgelöst hast, bzw. diesen used ...

    #include <iostream>
    
    void pause();
    
    int main()
    {
        std::cout << "\nLieber Leser,\ngoennen Sie sich jetzt eine ";
        pause();
        std::cout << "!" << endl;
    }
    
    void pause()
    {
        std::cout << "PAUSE" << std::endl;
    }
    

    und schon sollte es gehen.



  • (D)Evil, leider klappt das (zumindest bei mir) nicht. Anscheinend wird in iostream unter Unix irgendein betriebssystemspezifischer Header eingefügt, ohne ihn in einen Namensbereich zu packen. Mit anderen Worten: Das ist ein Bug.

    Lösen lässt sich das, indem man selbst einen Namensbereich verwendet:

    #include <iostream>
    
    using namespace std;
    
    namespace test {
        void pause();    // Prototyp
    }
    
    int main()
    {
        cout << endl << "Lieber Leser, "
        << endl << "goennen Sie"
        << " sich jetzt eine ";
    
        test::pause();
        cout << "!" << endl;
    
        return 0;
    }
    
    namespace test {
        void pause()
        {
            cout << "PAUSE";
        }
    }
    

    /EDIT: Ich möchte darauf hinweisen, dass es natürlich besserer Stil wäre, nicht (zumindest nicht global) 'using namespace std' zu verwenden. Aber: in einer Cpp-Datei spricht da eigentlich nichts gegen. Wenn tatsächlich ein Namenskonflikt auftritt, so ist dieser lokal und lässt sich leicht beheben.



  • Vielen Dank für Eure Antworten. Das hat mir sehr weitergeholfen!

    Greetz
    Polluxx


Anmelden zum Antworten