Devo dichiarare le funzioni di chiamata di sistema in C?

Ho letto questa risposta: Deve dichiarare il prototipo di funzione in C?

La mia domanda è più specifica:

In un programma che utilizza chiamate di sistema come access() , open() , creat() , write() , read() … Devo dichiarare ogni funzione di chiamata di sistema? È così che funziona C? Perché sto ottenendo il seguente:

 hw1.c: In function 'main': hw1.c:50:9: warning: implicit declaration of function 'access' [-Wimplicit-function-declaration] hw1.c:131:9: warning: implicit declaration of function 'lseek' [-Wimplicit-function-declaration] hw1.c: In function 'writeFile': hw1.c:159:17: warning: implicit declaration of function 'write' [-Wimplicit-function-declaration] 

Fondamentalmente, sembra che C sia arrabbiato con ogni funzione di chiamata di sistema che sto usando. Sono un po ‘nuovo a C e questo mi sembra strano anche se so che devo dichiarare le funzioni che scrivo. Penso che C conoscerebbe le funzioni di chiamata di sistema e non avrebbe bisogno che io le dichiari esplicitamente nel codice.

Devo fare qualcosa del genere:

int access(const char *pathname, int mode);

Se è così, perché ha senso? Uso altre lingue e non devo mai farlo.

Sì, dovresti includere l’intestazione corretta per ogni chiamata di funzione del sistema effettuata. Non scrivi tu stesso le dichiarazioni, le sbaglierai. Usa l’intestazione!

Per le funzioni che citi, le intestazioni pertinenti sono:

 #include  /* Many POSIX functions (but not all, by a large margin) */ #include  /* open(), creat() - and fcntl() */ 

Vedi POSIX 2008 per trovare l’intestazione corretta per altre funzioni POSIX.

Lo standard C99 richiede che tutte le funzioni siano dichiarate o definite prima di essere utilizzate.


Per le tue funzioni, dovresti emulare il ‘sistema’. Ci sarà un’intestazione che dichiara la funzione, il file sorgente che la implementa e gli altri file sorgente che utilizzano la funzione. Gli altri file di origine utilizzano l’intestazione per ottenere la dichiarazione corretta. Il file di implementazione include l’intestazione per assicurarsi che la sua implementazione sia coerente con ciò che gli altri file di origine si aspettano. Quindi l’intestazione è la colla che tiene tutto insieme.

Non devi dichiarare ognuno di per sé. Quello che devi fare è includere i file di intestazione corretti che contengono le dichiarazioni di queste funzioni. Per esempio:

 #include  #include  #include  #include  

stdio.h , fcntl.h e unistd.h (supponendo che tu stia codificando per * nix) sono quelli necessari per le funzioni che hai menzionato. Per informazioni specifiche, consultare la documentazione (es. man lseek ).

Devi farlo in quasi tutte le lingue tranne che per un set di librerie “core”. Java, C #, Perl, ecc. Hanno tutti forms di import o use , o riferimenti in configurazioni di build, o … per cose al di fuori della libreria principale. C non è diverso, eccetto che ha una “piccola libreria” core (cioè inesistente) – nessuna delle intestazioni della libreria viene inclusa di default.

#include ciò che stai cercando. Controlla la pagina man per ognuna di queste funzioni e saprai quali intestazioni devi includere.