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

OP #3666298
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?!
Gast #3666792
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.
Gast #3666821
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)
OP #3667281
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
Gast #3667382
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren