Deklaration von Prototypen in C
-
Hallo,
ich habe ein Problem mit einem C-Programm. Es handelt sich um ein einfaches Programm zur Erstellung von Zufallszahlen über die bekannten Funktionen srand() und rand(). Soweit mir bekannt ist, ist eine Deklaration der Funktion notwendig wenn nicht vorher mittels include die entsprechende Header Datei includiert wird. Mein Programm sieht folgendermaßen aus:
#include <stdio.h> void srand(unsigned int seed); int rand(void); int main() { srand(10); zahl = rand(); ...
Leider kommt es zu einem Linker-Error LNK2001 solange ich nicht die stdlib.h includiere. Ursache ist ein Nichtaufgeloestes externes Symbol "int __cdecl rand(void)" (?rand@@YAHXZ).Mein Compiler ist VS C++ 6.0. Würde mich über jede Hilfe oder Ratschläge freuen
Grüße
StarShaper
-
Warum inkludierst du denn nicht einfach die <stdlib.h>
Für das ist sie ja da.Grüße,
Harri
-
*nix*
-
harry3 schrieb:
Warum inkludierst du denn nicht einfach die <stdlib.h>
Für das ist sie ja da.Ich weiß,
aber ich möchte wissen wie eine Deklaration ohne stdlib.h funktioniert.Gruß
StarShaper
-
könnte mir vorstellen das int rand() in vc als macro definiert ist
dann funktioniert deine declaration natürlich nicht ohne stdlib.h
K.
-
ZuK schrieb:
könnte mir vorstellen das int rand() in vc als macro definiert ist
dann funktioniert deine declaration natürlich nicht ohne stdlib.h
K.Dies klingt ziemlich gut. Kannst du das eventuell noch näher erläutern?
Gruß
StarShaper
-
keine ahnung wie es wirklich ist.
eine möhlichkeit wäre:
es gibt eine interne funktion zb.float __random(void );
und in der stdlib.h steht nur
#define rand (int)__random()
der linker findet dann natürlich keine funktion
int rand();K.
-
StarShaper schrieb:
harry3 schrieb:
Warum inkludierst du denn nicht einfach die <stdlib.h>
Für das ist sie ja da.Ich weiß,
aber ich möchte wissen wie eine Deklaration ohne stdlib.h funktioniert.Gruß
StarShaperGarnicht.
Den Funktionskopf schreibst du nur oben in die *.c Datei, wenn die Funktionen in der gleichen Datei sind, aber unter der Funktion, die diese Aufrufen würden.z.b.
void test(int i); int main() { test(1); return 0; } void test(int i) { // mache etwas }
würde gehen.
int main() { test(1); return 0; } void test(int i) { // mache etwas }
aber nicht, weil der Main Funktion keine Funktion namens test bekannt ist. Ich kann mir nicht vorstellen, dass das auch mit Funktionen gehen soll, die in einer ganz anderen *.c Datei sind wie halt rand().
-
Danke für die schnellen Antworten - super Forum! Problem hat sich erledigt.
Gruß
StarShaper
-
feigling schrieb:
aber nicht, weil der Main Funktion keine Funktion namens test bekannt ist. Ich kann mir nicht vorstellen, dass das auch mit Funktionen gehen soll, die in einer ganz anderen *.c Datei sind wie halt rand().
das stimmt so nicht.
der compiler kennt überhaupt kein konzept header.
wenn du dir die fehlermeldungNichtaufgeloestes externes Symbol "int __cdecl rand(void)" (?rand@@YAHXZ)
ansiehst war der compiler zufrieden mit der declaration. der linker hat rand() nicht gefunden.
K
-
ZuK schrieb:
wenn du dir die fehlermeldung
Nichtaufgeloestes externes Symbol "int __cdecl rand(void)" (?rand@@YAHXZ)
ansiehst war der compiler zufrieden mit der declaration. der linker hat rand() nicht gefunden.
KGenau das ist es ja - ich weiß ja nicht, was du willst, aber genau das was du gemacht hast, ist eingetreten - du hast "rand()" deklariert, also dem Compiler bekanntgegeben, sodass er kompilieren konnte, nun sucht natürlich der Linker nach der Definition - und findet keine, solange sie du nicht dazulinkst, oder
?
-
Till schrieb:
nun sucht natürlich der Linker nach der Definition - und findet keine, solange sie du nicht dazulinkst, oder
?
Wie konnte er deiner Meinung nach srand finden?
In der Regel wird Standardbibliothek immer dazu gelinkt, ausser du sagst dem Compiler explizit, dass du das nicht willst.