inaktiver Präprozessorblock



  • Guten Tag,

    ich brauche Holfe bei folgenem Problem.

    Ich möchte ein Tic_Tac_Toe als Win32-Konsolenanwendung programmieren.
    Der eigentliche Code ist auch kein Problem, ich hatte bereits ein entsprechendes Programm geschrieben, aber das ist fast zwei Jahre her. Man könnte sagen, es sieht etwas unschön aus.

    Zum zwecke einer besseren Übersicht wollte ich nun verschiedene Bestandteile in andere Dateien auslagern.

    Ich habe jetzt eine haupt.cpp (mit "Menü" und eingabe eines Spielernamens)
    Multiplayer.cpp (Wo dann zwei gegeneinander spielen können)
    Singleplayer.cpp (Ein Spieler gegen den Computer)

    Die in haupt.ccp eingegebenen Namen werden an die anderen Datein weitergegeben.

    Dazu gibt es dann noch die Headerdatei KontrolleSP.h
    Diese ist so aufgebaut:

    # include <stdio.h>
    # include <stdlib.h>
    # ifndef _haupt_cpp_
    # define _haupt_cpp_
    
    # ifndef _Singleplayer_cpp_
    # define _Singleplayer_cpp_
    # ifndef _Multiplayer_cpp_
    # define _Multiplayer_cpp_
    
    extern char Singleplayer(char player1);
    extern char Multiplayer(char player1, char player2);
    
    # endif _haupt_cpp_
    # endif _Singleplayer_cpp_
    # endif _Multiplayer_cpp_
    

    Der Bereich zwischen # ifndef _haupt_cpp_ und # endif _Multiplayer_cpp_ ist nun ausgegraut mit dem Hinweis "inaktiver Präprozessorblock"

    Dazu gibt es noch die Fehlermeldung
    1>haupt.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""char __cdecl Singleplayer(char)" (?Singleplayer@@YADD@Z)" in Funktion "_main".
    1>haupt.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""char __cdecl Multiplayer(char,char)" (?Multiplayer@@YADDD@Z)" in Funktion "_main".

    Multiplayer(player1,player2);
    //[...]
    Singleplayer(player1);
    

    Trotz intensiver Vergleiche mit einem ähnlichen Programm (was funktioniert) kann ich den Fehler nicht finden.

    MfG feps

    PS: Es mag sein, dass man das alles effektiver Programmieren kann, aber ich möchte es gerne auf diesem Weg tun, da ich momentan nur diesen Weg kenne.


  • Mod

    endif hat keine Argumente. Wenn es sich um Kommentare handeln soll, so sind diese falsch, das endif in Zeile 16 gehört zu dem if in Zeile 9.

    Bezeichner, die mit einem Unterstrich gefolgt von einem Großbuchstaben oder allgemein mit einem Unterstrich beginnen, sind reserviert und können daher Probleme machen.

    Was der Compiler sagt hat Vorrang gegenüber dem, was die IDE sagt. Hast du Schwierigkeiten bei der Übersetzung?

    Was ist überhaupt der Sinn dieser ifndefs? Sie sehen aus wie include-Guards sind aber derart merkwürdig platziert, verschachtelt und benannt, dass ich vermute, dass sie Unsinn sind.

    PS: Funktionsdeklarationen sind übrigens automatisch extern. Die meisten Leser dürften erst einmal stocken und sich fragen, was das soll, weil sie nie extern für Funktionen gesehen haben.



  • Viele Libs machen das so mit extern . zlib beispielsweise. Ich nehme an, dass die damit um ranzige Compiler rumarbeiten wollen.



  • @dachschaden_off
    Ich würde eher auf "because we can" tippen 😉


Anmelden zum Antworten