Das mysteriöse #include-Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Das mysteriöse #include-Problem

    Hallo Freunde des Longdrinks,

    ich war gerade dabei etwas zu kompilieren, da liefen mir folgende Fehler über den Weg:

    Quellcode

    1. g++ -O0 -g3 -Wall -c -fmessage-length=0 -pthread -MMD -MP -MF"src/classes/ServerSocket.d" -MT"src/classes/ServerSocket.d" -o"src/classes/ServerSocket.o" "../src/classes/ServerSocket.cpp"
    2. In file included from ../src/classes/ServerSocket.cpp:8:
    3. ../src/classes/ServerSocket.h:24: error: ISO C++ forbids declaration of ‘vector’ with no type
    4. ../src/classes/ServerSocket.h:24: error: expected ‘;’ before ‘<’ token
    5. ../src/classes/ServerSocket.h:33: error: ISO C++ forbids declaration of ‘vector’ with no type
    6. ../src/classes/ServerSocket.h:33: error: expected ‘;’ before ‘<’ token


    Beim kompilieren von ServerSocket.cpp, das ServerSocket.h einbezieht und das wiederum ServerSocketClient.h einbezieht (ServerSocket.cpp <- ServerSocket.h <- ServerSocketClient.h), tritt der Fehler im ServerSocket Headerfile auf.
    Aus den Fehlern wird klar, dass jeweils der vector mit der Klasse ServerSocketClient nicht deklariert werden kann, da er nicht existent ist (siehe Quellcode). Das kommt mir ein bisschen komisch vor, weil ServerSocket.h eigentlich das Headerfile von ServerSocketClient einbindet.

    Warum findet er den ServerSocketClient Typ nicht?

    Quellcode

    1. /*
    2. * ServerSocket.h
    3. *
    4. * Created on: Jan 14, 2012
    5. * Author: imp
    6. */
    7. #include <stdlib.h>
    8. #include <pthread.h>
    9. #include <netinet/in.h>
    10. #include <strings.h>
    11. #include "ServerSocketClient.h"
    12. #ifndef SERVERSOCKET_H_
    13. #define SERVERSOCKET_H_
    14. using namespace std;
    15. struct ServerSocketLink {
    16. int* link;
    17. int* port;
    18. pthread_t* you;
    19. sockaddr_in* address;
    20. vector<ServerSocketClient*>* clients;
    21. pthread_mutex_t* lock;
    22. };
    23. class ServerSocket {
    24. private:
    25. int socketLink, socketPort, socketBacklog;
    26. sockaddr_in socketAddress;
    27. pthread_t socketThread;
    28. vector<ServerSocketClient*> socketClients;
    29. pthread_mutex_t socketAcceptLock;
    30. public:
    31. ServerSocket(int) throw (int);
    32. ~ServerSocket();
    33. void setBacklog(int);
    34. void listen();
    35. };
    36. #endif /* SERVERSOCKET_H_ */
    37. /*
    38. * ServerSocketClient.h
    39. *
    40. * Created on: Jan 14, 2012
    41. * Author: imp
    42. */
    43. #include <pthread.h>
    44. #include <netinet/in.h>
    45. #ifndef SERVERSOCKETCLIENT_H_
    46. #define SERVERSOCKETCLIENT_H_
    47. struct ServerSocketClientLink {
    48. int* link;
    49. int* server;
    50. int* port;
    51. sockaddr_in* address;
    52. pthread_t* you;
    53. };
    54. class ServerSocketClient {
    55. private:
    56. int clientLink;
    57. int* serverLink;
    58. int* serverPort;
    59. sockaddr_in* serverAddress;
    60. pthread_t clientThread;
    61. public:
    62. ServerSocketClient(int, int*, int*, sockaddr_in*);
    63. void listen();
    64. };
    65. #endif /* SERVERSOCKETCLIENT_H_ */
    Alles anzeigen


    Vermutlich ist es etwas ganz simples, aber im Moment kann ich den Fehler im System einfach nicht erkennen.
    Es wäre super toll, wenn mir dafür jemand eine Lösung präsentieren könnte, danke.
    IMP, out.
  • Die Unterschiede von C und C++ sind dir bekannt?
    Dein gezeigter Quelltext sieht nach einer wilden Mischung aus C und C++ aus!
    Du solltest dich entweder für C oder C++ entscheiden.

    Es gibt in C und auch in C++ reservierte Begriffe, die man nicht beliebig im Quelltext für andere Zwecke nutzen sollte.
    Mach dich mal schlau welche Begriffe das von K&R-C bis zu C11 oder C++11 sind. Wenn möglich auch die Begriffe für selbst gewählte Namen meiden, die nur kurzzeitig in der Norm verankert waren. Oder, wenn man die nutzt und eine Fehlermeldung kommt, sollte man ahnen wo man suchen muss.

    Nachtrag: Nur die Header in eine selbst geschriebene .h Datei setzen, die da unbedingt benötigt werden :!:
    Alles andere gibt oft Ärger. Besonders, wenn wie in deinem Fall C und C++ Quelltext vermischt wird. C-Header also nur da wo benötigt für C-Quellcode. Analog gilt das auch für C++.

    Muss in einem Projekt mit mehreren Programmiersprachen gearbeitet werden, ist den Schnittstellen zwischen den Sprachen besondere Aufmerksamkeit zu widmen!

    MfG bcc-fan

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von bcc-fan ()

  • Die Unterschiede sind mir bekannt. Jedoch bis auf die Deklarierung von der ServerSocketLink und ServerSocketClientLink struct, die ich bis jetzt noch als Pointerregister brauche ist der Rest eigentlich C++.
    Ich kann mich da natürlich täuschen, aber nichtsdestotrotz lag das Problem nicht an einer Keywordkollision oder ähnlichem. Es lag einfach daran, dass std::vector nicht in stdlib.h, sondern im vector-Headerfile liegt.

    Dein Ansatz die include-Anweisungen mal neu zu strukturieren hat den Fehler gleich aufgedeckt, vielen Dank.
    IMP, out.
  • @bcc-fan:
    Ist dieses "trenne c & c++" ästhetischer, pragmatischer oder tatsächlich von notwendiger Natur?
    Ich würde es vermutlich ähnlich machen, ich würde sicher immer nach der kürzeren (& besser lesbaren) Variante suchen egal ob c mit oder ohne ++.
    Einfach weil in meinem Kopf dieses "C ist eine echte echte Untermenge von c++" regiert. (Klar, dass libs und deren Benutzung Sprachkenntnis ausnutzen und fordern.)

    Wie du sicher ableiten kannst, ist meine C(++) Erfahrung nicht gross - deswegen die Frage.
  • Ich bin mir jetzt nicht ganz sicher wie das bei C11 und C++11 ist? Bei der Standard-Generation davor war C keine echte Untermenge von C++ mehr :!:
    Beispiel: VLAs (Variable Length Arrays) die, wenn ihr euch an die Standards haltet, nur unter C ab C99 funktionieren.

    Und schau dir mal die Header string.h, string ohne h und cstring ohne h an und vergleiche. Okay der Vergleich kann je nach Compiler unterschiedlich ausfallen. Und versuche mal die Möglichkeiten die du in C hast mit denen in C++ bezüglich der Strings zu vergleichen.

    Dann kann man sich noch Ärger einfangen, wenn du C-Speicherreservierungen in C++ nutzt.

    Es ist bei vielen C-Funktionen so das das Programm zwar kürzer ausfällt, aber mit den C++ Funktionen sicherer läuft.
    Das heisst du musst bei C wesentlich mehr achten auf fehlerhaften Quellcode z.B. bezüglich Speicherüberläufe oder Ähnlichem.

    Leider findet man im Netz noch oft relativ schlechten Quellcode.

    Wenn du Spass an C++ hast, schau dir doch mal die Sache mit den Containern an. Und überlege wie du vergleichbares in C gebacken bekommst.
    C hat klar Vorteile, wenn der Speicherplatz knapp ist oder das letzte Quentchen an Geschwindigkeit notwendig ist. Aber das ist heute ja selten der Fall.

    Der Sprachumfang von C ist kleiner. Obwohl da gibt es auch tricky Quelltext.

    Dann gibt es ja noch die MSDN von Microsoft mit der langen Liste von C-Funktionen, die man besser nicht nutzen sollte da die zu unsicher sind. Obwohl die dort angegeben Alternativen sind oft nicht Standard-C sondern Microsoft-C.

    MfG bcc-fan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von bcc-fan ()