Forum: PC-Programmierung C - hat Initialisierung, aber unvollständigen Typ bei -std=c99 (using linux timer lib)


von X. H. (shadow0815)


Lesenswert?

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <time.h>
4
5
6
 void _delay_ms(int t){
7
   //printf("i do _delay_ms(%d)\n",t);
8
9
int i;
10
for(i=0;i<t;i++)
11
{
12
13
   struct timespec millisecond={0,1000000L};
14
     nanosleep(&millisecond, NULL);
15
}
16
17
   return;
18
   }
19
20
21
22
int main()
23
{
24
    _delay_ms(3000);
25
    printf("Hello world!\n");
26
    return 0;
27
}

ohne -std=c99 geht das mit krieg ich: (code blocks 13.12 Ausgabe)

Variable »millisecond« hat Initialisierung, aber unvollständigen Typ


In welchem mode sollte man denn am besten linux c programme schreiben. 
default old scool ansi-c?!

von B. S. (bestucki)


Lesenswert?

struct timespec gehört nicht zur Standardbibliothek. Kompiliert du nun 
mit -std=c99, wird diese compilerspezifische Erweiterung ignoriert:
http://bytes.com/topic/c/answers/500642-struct-c99

von Peter (Gast)


Lesenswert?

Davon abgesehen gibt es unter Linux für solche Zwecke die Funktion 
usleep() ...

von Stefan R. (srand)


Lesenswert?

std=gnu99 wird vermutlich gehen.

von Rolf Magnus (Gast)


Lesenswert?

Wie die man-Page ja auch schon sagt, ist nanosleep POSIX und nicht ISO 
C.

X. H. schrieb:
> In welchem mode sollte man denn am besten linux c programme schreiben.
> default old scool ansi-c?!

In was immer deine Anforderungen abdeckt. Aber in "old scool ansi-c" 
wirst du bei nanosleep die gleiche Fehlermeldung bekommen.

von DirkB (Gast)


Lesenswert?

struct timespec wird in time.h definiert, wenn folgende Bedingung 
erfüllt ist:
1
#if !defined __timespec_defined &&        \
2
    ((defined _TIME_H &&          \
3
      (defined __USE_POSIX199309 || defined __USE_MISC)) ||  \
4
      defined __need_timespec)

von Rolf Magnus (Gast)


Lesenswert?

DirkB schrieb:
> struct timespec wird in time.h definiert, wenn folgende Bedingung
> erfüllt ist:

Die Info bringt aber nichts, denn das heißt nicht, daß man einfach von 
Hand die nötigen defines setzen darf.

von X. H. (shadow0815)


Lesenswert?

Ok. Dank eurer antworten konnte ich noch weiter googlen:

The -std=c99 option means that you want strict compliance to the 1999
version of the C standard. That standard does not define struct timespec
or nanosleep in <time.h> or anywhere else. Thus, there is no bug.

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=314435#10

Aber wie man lesen kann sind Andere dort auch erstmal verwirrt und 
denken es is ein Bug ^^

Das macht ja den umgang mit der standard c lib wieder komplexer. ich 
dachte alles was da ist kann man auch einfach so nehmen. wird wohl zum 
glück für das meiste auch so sein denk

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

X. H. schrieb:
> Das macht ja den umgang mit der standard c lib wieder komplexer. ich
> dachte alles was da ist kann man auch einfach so nehmen. wird wohl zum
> glück für das meiste auch so sein denk

Nun, hier gibt's halt einen Widerspruch zwischen POSIX und ISO C. 
Ersteres schreibt vor, daß es nanosleep geben soll und daß es in time.h 
deklariert ist. In ISO C gibt's time.h aber auch, allerdings darf da nur 
das drin sein, was die Norm angibt, und da gehört nanosleep nicht dazu.
Im Zweifelsfall sagt dir die man-Page, wozu das gehört. Bei nanosleep 
steht da:

CONFORMING TO
       POSIX.1-2001.

also kein ISO C. Wenn du die Funktion benutzen willst, mußt du eben 
-std=gnu99 statt c99 angeben.

von Stefan R. (srand)


Lesenswert?

X. H. schrieb:
> Das macht ja den umgang mit der standard c lib wieder komplexer. ich
> dachte alles was da ist kann man auch einfach so nehmen.

Du willst ja eben was nehmen, was in der Standardbibliothek nicht drin 
ist!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.