2012-01-16 16 views
9

Ho iniziato a studiare i temporizzatori POSIX, quindi ho iniziato anche a fare degli esercizi, ma ho avuto subito qualche problema con il compilatore. Durante la compilazione di questo codice, ricevo strani messaggi su macro come CLOCK_MONOTONIC. Quelli sono definiti in varie librerie come time.h ecc. Ma il compilatore mi dà errori come se non fossero definiti.Costanti non caricate dal compilatore

E 'strano perché sto usando un Fedora 16, e alcuni dei miei amici con Ubuntu ottenere errori di compilazione in meno rispetto I: -O

sto compilazione con gcc -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -lrt

Qui gli errori che ottengo:

  • struct sigevent sigeventStruct:

    storage size of ‘sigeventStruct’ isn’t known 
    unused variable ‘sigeventStruct’ [-Wunused-variable] 
    Type 'sigevent' could not be resolved 
    unknown type name ‘sigevent’ 
    
  • sigeventStruct.sigev_notify = SIGEV_SIGNAL:

    ‘SIGEV_SIGNAL’ undeclared (first use in this function) 
    request for member ‘sigev_notify’ in something not a structure or union 
    Field 'sigev_notify' could not be resolved 
    
  • if(timer_create(CLOCK_MONOTONIC, sigeventStruct, numero1) == -1):

    implicit declaration of function ‘timer_create’ [-Wimplicit-function- declaration] 
    ‘CLOCK_MONOTONIC’ undeclared (first use in this function) 
    Symbol 'CLOCK_MONOTONIC' could not be resolved 
    

Ecco il codice:

#include <stdio.h> 
#include <fcntl.h> 
#include <time.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <signal.h> 

int main() 
{ 
     timer_t numero1; 
     struct sigevent sigeventStruct; 
     sigeventStruct.sigev_notify = SIGEV_SIGNAL; 
     if(timer_create(CLOCK_MONOTONIC, sigeventStruct, numero1) == -1) 
     { 
       printf("Errore: %s\n", strerror(errno)); 
     } 
     return 0; 
} 
+1

Solo un suggerimento, invece di avere gli errori in forma di punti, basta copiarli esattamente come sono all'interno di un blocco '

' nella domanda. –
                        
                            
                                
                            
                        
                    

+0

Ok la prossima volta terrò in considerazione il tuo suggerimento –

risposta

13

In primo luogo, è possibile compilare il codice con -std=gnu99 invece di -std=c99 se vuoi avere gli identificatori SIGEV_SIGNAL, e CLOCK_MONOTONIC availa ble.

Come indicato da @adwoodland, questi identificativi vengono dichiarati quando _POSIX_C_SOURCE è impostato su un valore> = 199309L, ad esempio -std=gnu99. Puoi anche usare -D_POSIX_C_SOURCE=199309L -std=c99 o avere la macro definita nel codice sorgente.

In secondo luogo, vedere il prototipo timer_create, devi passare puntatori come il secondo e il terzo argomento della funzione:

timer_create(CLOCK_MONOTONIC, &sigeventStruct, &numero1) 
          ^   ^

Inoltre è necessario includere l'intestazione standard string.h per strerror dichiarazione di funzione.

+0

Una buona cattura sul 'timer_t' è anch'essa un puntatore. Mi è mancato perché "-Wall -Wextra' non ha nemmeno avvertito! – Flexo

+0

Sono un po 'confuso se compilo con -std = gnu99 ho ancora bisogno di #define _POSIX_C_SOURCE 199309L per essere scritto nella lista dei codici? Quando si utilizza -std = c99 è la stessa cosa usando -D_POSIX_C_SOURCE = 199309L -std = c99 o -std = c99 e il #define _POSIX_C_SOURCE 199309L? –

+0

@Caterpillar se si utilizza '-std = gnu99' non si ha nulla da fare,' _POSIX_C_SOURCE' verrà automaticamente definito e il valore sarà> '199309L'. Con '-std = c99', usando' -D' o la soluzione '# define' è equivalente. Quando si usa '# define' assicurati di mettere' # define' in una riga prima che includa 'time.h' e' signal.h' – ouah

6

Se si utilizza -std=c99 dovete dire GCC si sta ancora utilizzando le versioni recenti di POSIX:

#define _POSIX_C_SOURCE 199309L 

prima qualsiasi #include, o anche con -D sulla riga di comando.

Altri errori:

  • mancanti #include <string.h>
  • Hai bisogno di un puntatore per timer_create, cioè &sigeventStruct invece di sigeventStruct
4

Le altre risposte suggeriscono _POSIX_C_SOURCE come macro di abilitazione. Certamente funziona, ma non abilita necessariamente tutto ciò che è nella Single Unix Specification (SUS). Per questo, è necessario impostare _XOPEN_SOURCE, che imposta automaticamente anche _POSIX_C_SOURCE. Ho un colpo di testa che io chiamo "posixver.h" quali contiene:

/* 
** Include this file before including system headers. By default, with 
** C99 support from the compiler, it requests POSIX 2001 support. With 
** C89 support only, it requests POSIX 1997 support. Override the 
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE. 
*/ 

/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */ 
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */ 
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */ 

#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE) 
#if __STDC_VERSION__ >= 199901L 
#define _XOPEN_SOURCE 600 /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */ 
#else 
#define _XOPEN_SOURCE 500 /* SUS v2, POSIX 1003.1 1997 */ 
#endif /* __STDC_VERSION__ */ 
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */ 

E 'ottimizzato per i sistemi con cui lavoro che non tutti riconoscono il valore 700. Se stai lavorando su un Linux relativamente moderno, credo che tu possa usare 700. È in un'intestazione, quindi devo cambiare solo un file quando voglio modificare le regole.

+0

Grazie, tengo questa libreria per ulteriori scopi –

1

ho risolto un sacco di problemi con -std = gnu99 (senza specificare tutte le versioni POSIX), ma sto ancora avendo

CLOCK_MONOTONIC could not be resolved

Cercando su internet ho trovato alcune segnalazioni di errori Eclipse con persone che si lamentano di questo. Dovuto controllare meglio se è un insetto Eclipse, perché con

gcc -Wall -w -o Blala timer.c -std=gnu99 -lrt

compila

+1

Sì, si tratta di un bug del plug-in CDT di Eclipse –

2

Riferendosi al problema CLOCK_MONOTONIC non essendo definito:

Come Caterpillar sottolineato questo è un problema eclisse, più precisamente un bug di CDT-Indexer con una soluzione alternativa a eclipse bugs, comment 12

+0

È necessario aggiungere la soluzione alternativa nel caso in cui il collegamento muoia – OMGtechy

Problemi correlati