Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

22.03.2010, 15:14

a.c:13: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »exit«

Also ich muss mich ein wenig in fork einarbeiten und dazu habe ich folgendes kleines Tutorial gefunden

Quellcode

1
http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel2.shtml#2_1

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fork.c

#include <sys/types.h>
#include <stdio.h>

int main()
{
 pid_t pid;

 printf("Hallo fork()\n");

 switch(pid=fork())
  {
    case -1: printf("Fehler bei fork().....\n"); exit(0);
    case  0: printf("Ich bin das Kind\n"); break;
    default: printf("Ich bin der Elternprozess\n"); break;
  }
 exit(0);
}


Leider gibt mir der kompiler eine Fehlermeldung bei dem Code aus

Quellcode

1
2
3
4
5
gcc -o fork fork.c

fork.c: In Funktion »main«:
fork.c:12: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »exit«
fork.c:16: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »exit«


Ist der Gesamte Code in dem Tutorial defekt oder benötige ich noch irgend eine Bibliotek oder ein anderes Compiler Kommando um den Code zu übersetzen?
Phenom X4 9550
Gigabyte GA-MA770-UD3
Gentoo 64 Bit Stable
8 GB Ram
Audigy 2 Zs
Geforce 9800 GTX
VDR
Hauppauge Nexus-S Rev 2.2 + 2.1

Lenovo G550 T4300
Gentoo 64 Bit Stable
4 GB Ram

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »cyrix1983« (23.03.2010, 06:11)


2

22.03.2010, 16:10

Nun ...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ man -s 3 exit -P /bin/cat | fmt | head -n 15
EXIT(3)                    Linux Programmer's Manual
EXIT(3)



NAME
       exit - cause normal process termination

SYNOPSIS
       #include <stdlib.h>

       void exit(int status);

DESCRIPTION
       The  exit() function causes normal process termination


=)

Alles klar?
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

3

22.03.2010, 21:27

Noch was anderes, da das Problem ja dyle schon gezeigt hat.

Ich würde Variablen IMMER initialisieren (gar nicht erst anders angewöhnen).

Klammern für die case zu setzen ist zwar nicht notwendig, aber würde lieber zuviel, als zuwenig verwenden. Erleichtert bei größeren Mengen an Code die Übersicht ungemein (meine Meinung).
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.

4

23.03.2010, 06:16

Danke an euch beide, werde mir das Tutorial jetzt weiter zu gemüte führen, hoffentlich erfolgreich.

Quellcode

1
#include <stdlib.h>


hat geholfen und das Programm läuft jetzt auch ich frage mich nur warum der Programmierer der das Tutorial geschrieben hat, den Code vollständig aussehen lässt obwohl er so nicht kompilierbar ist. -> hat mich übrigends auch bei c++ verwirrt dass in einigen büchern dass "using namespace std" weggelassen wird und trotzdem im quelltext cout und nicht std::cout verwendet wird.
Phenom X4 9550
Gigabyte GA-MA770-UD3
Gentoo 64 Bit Stable
8 GB Ram
Audigy 2 Zs
Geforce 9800 GTX
VDR
Hauppauge Nexus-S Rev 2.2 + 2.1

Lenovo G550 T4300
Gentoo 64 Bit Stable
4 GB Ram

5

23.03.2010, 07:07

Der gcc wurde im Laufe der 4er Version rigoroser, was das Fehlen von "#include" Anweisungen von Standardheadern betrifft.

Das Fehlen von der "namespace" Anweisung ist, wenn ich mich recht erinnere auf andere C++ Kompiler zurückzuführen, die "std" vorab benutzen.
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.

6

23.03.2010, 09:51

Errrm ... also hier bei mir @work fahren da die Policy: "-Wall -Wextra -pedantic -Werror" mit dem gcc.
... und das klappt auch. =)

Ich würde bei der Arbeit mit dem gcc generell diese knallharten Einstellungen empfehlen und jeder Fehlermeldung nachgehen und diese ausbügeln versuchen.

Klar, das ist so ziemlich die Schallmauer, was das betrifft. ABER: da lernt man dann auch ungemein mehr und die Progs werden wirklich sauberer und stabiler.

... aber da bin ich/wir vermutlich ziemlich allein auf weiter Flur. Meiner Erfahrung nach, sind viele ja schon glücklich, wenn ihr C/C++ Prog einmal erfolgreich kompiliert. :rolleyes:
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

7

23.03.2010, 12:06

Finde ich auch genau richtig.
-Werror verwende ich bisher nicht, da wenn ich bei der Erstellung von Funktionen bestimmte Argumente noch nicht verwende, dann wird man ja über "unused parameters" gewarnt.
Verwendest du hier immer ein: "__attribute__((unused))"?

Ich glaube ich sollte dieses Makro mal probieren:
http://sourcefrog.net/weblog/software/la…s/C/unused.html
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.

8

23.03.2010, 12:21

Nein, da wir auch den Compiler wechseln können wollen. Da könnte ich jetzt eine #ifdef - #define - #endif Serie setzen, aber das finde ich unschön. Es ist Policy Präprozessoranweisungen auf ein Minimum zu halten.

Bei deinem konkreten Fall versuchen wir in der Regel wirklich alles so zu definieren, das die Parameter tatsächlich gebraucht werden. In C geht das auch i.d.R..

Bei C++ ist das kniffliger. Wenn es da nicht anders geht konsumieren wir die Variablen künstlich, a la:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * eats up variable foo to satisfy compiler
 *
 * @param    foo    var to be eaten
 */
void eatup_foo(int foo) {                                                                                                              
    static int g_foo = 0;                                                                                                              
    g_foo = foo;                                                                                                                       
}                                                                                                                                      
                                                                                                                                       
void bar(int foo) {                                                                                                                    
    /* we don't use foo here */                                                                                                        
    eatup_foo(foo);                                                                                                                    
                                                                                                                                       
    /* rest of the function */                                                                                                         
}


Zugegeben, das ist genauso unhübsch und irgendwann wird der gcc das erkennen, dass die static variable da nicht public ist und anfangen auch hier zu meckern. Es ergibt ja so keinen Sinn. Ist also ein echter Hack wie ich allein und ausschließlich "error: unused parameter ‘foo’" umschiffe.

Es ist aber noch innerhalb der Sprache und frei von compilerrelevanten Anweisungen.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

9

24.03.2010, 15:19

Schon klar.
Aber es gibt eben Fälle bei C, da kann man es nicht frei definieren, weil es sich um "system calls" handelt.
Biespielsweise das Argument für die Funktionsübergabe bei pthread_create.
Die Funktion muss ein Argument vom Typ "void *" haben...

Essen kann mans ja auch mittels (wie im vorherigen Link dargestellt):
(void) unusedParameter;
"Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun."
"It's only after we've lost everything, that we're free to do anything!"

Jabber: Die ID kann via PN erfragt werden.