2012-04-07 13 views
18
gcc (GCC) 4.6.3 
c89 

Sto cercando di utilizzare usleep. Tuttavia, continuo a ricevere il seguente avviso:dichiarazione implicita di funzione usleep

implicita dichiarazione di funzione usleep

Ho incluso il file di intestazione unistd.h.

Le pagine man menzionano qualcosa su questo. Ma non sono sicuro di averlo capito:

usleep(): 
    Since glibc 2.12: 
     _BSD_SOURCE || 
      (_XOPEN_SOURCE >= 500 || 
       _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && 
      !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) 
    Before glibc 2.12: 
     _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED 

Ma non sono sicuro di cosa fare con quanto sopra?

+7

Il suggerimento che vi siete persi si trova nella stessa pagina man è stato copiato il testo di cui sopra: 'POSIX.1-2001 dichiara questa funzione obsoleta; usa invece nanosleep (2). POSIX.1-2008 rimuove le specifiche di usleep(). 'Quindi vedi che c'è un'intenzione dietro al fatto di renderne così difficile l'accesso. Basta non usarlo nel nuovo codice. –

risposta

24

Tale elenco è la pre-condizione per avere definito usleep. È fondamentalmente un'espressione simile a C che coinvolge le variabili #define che devono essere vere prima di includere il file di intestazione.

Il file di intestazione per sé servirà solo a definire usleep all'interno di quello che è di solito un enorme nido di #ifdef dichiarazioni e gli sviluppatori hanno avuto il tempo di dirti ciò che è necessario fare in modo che non c'è bisogno di passare ore a cercare di capire voi stessi :-)

Supponendo che si sta utilizzando un glibc 2.12 o meglio, significa che sia necessario:

  • dichiarare _BSD_SOURCE; o
  • dichiarare una combinazione complicata di tre altre cose, che non mi preoccuperò di decodificare.

Probabilmente il soluzione più semplice è semplicemente quella di compilare con gc -D _BSD_SOURCE o mettere:

#define _BSD_SOURCE 

nel codice prima di includere il file di intestazione che ti dà usleep.

Probabilmente vorrai definirli prima dello qualsiasi incluso nel caso in cui vi siano delle dipendenze tra i vari file di intestazione.

+1

Grazie a quello ha funzionato. In realtà, dovevo dichiarare _BSD_SOURCE prima di ogni altro include. Altrimenti continuava a darmi lo stesso avvertimento. La mia versione glibc glibc-2.14.90-24.fc16.6.x86_64. – ant2009

+0

@ ant2009, sì è probabile poiché potrebbero esserci delle dipendenze tra le intestazioni. Lo aggiungerò alla risposta. – paxdiablo

+0

@paxdiablo la mia toolchain si lamenta che 'warning '_BSD_SOURCE e _SVID_SOURCE sono deprecati, usa _DEFAULT_SOURCE" ', quindi presumo che in alcuni casi' _BSD_SOURCE' non risolve il problema –

17

Questo può funzionare: Aggiungi -std=gnu99 durante la compilazione con gcc su Linux.

Esempio:

arm-linux-gcc -lpthread -std=gnu99 -o test ArmLinuxDataPipe1.2.1.c 
+0

Questo! Dicendo -std = c99 riceverai un avvertimento. – teroi

Problemi correlati