Newsgroup: it.lavoro.informatica
Titolo: domanda tecnica sul C

 
Premessa:
Ho un errore in compilazione
(ho provato sia con che senza l'opzione -std=c11)
 
gcc -std=c11 a.c
a.c: In function ‘main’:
a.c:19:7: warning: implicit declaration of function ‘fopen_s’; did you 
mean ‘fopen’? [-Wimplicit-function-declaration]
    ret=fopen_s(&f,"tutto_marco.txt","r");
        ^~~~~~~
        fopen
/usr/bin/ld: /tmp/ccyXgCNW.o: in function `main':
a.c:(.text+0x40): undefined reference to `fopen_s'
collect2: error: ld returned 1 exit status
 
l'unica include che c'e' in a.c e'
#include <stdio.h>
 
 
Domanda breve (sotto segue spiegazione piu' dettagliata):
 
sono io che ho una versione di gcc non aggiornata o e' proprio gcc che 
non e' compliant con lo standard del linguaggio (la terza opzione e' che 
sia io a non aver capito le modifiche allo standard,  [il che e' 
probabile] oppure bisogna includere/linkare qualcosa che io non 
includo/linko, and so on)?
 
Le versioni di Linux e gcc che uso io sono le seguenti
 
marco@marco-VirtualBox:~/previsioni$ uname -a
Linux marco-VirtualBox 4.18.0-11-generic #12-Ubuntu SMP Tue Oct 23 
19:22:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
 
marco@marco-VirtualBox:~/previsioni$ gcc --version
gcc (Ubuntu 8.2.0-7ubuntu1) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
 
 
Domanda con spiegazione più dettagliata (ma la domanda e' sempre la 
stessa di cui sopra):
 
 
Per motivi sicuramente piu' hobbystici che professionali, mi sono 
rimesso a scrivere codice, anche se sostanzialmente "a tempo perso" (e 
direi nche abbastanza "controvoglia"). Comunque non e' un software che 
devo dare a qualcuno. E' roba che serve solo a me.
 
Visto che posso usare il linguaggio che mi pare e visto che quello
che conoscevo meglio era sicuramente il C, ho pensato di usare questo.
 
Comunque, visto che anche questo non lo uso da oltre 10 anni,
ho visto che ci sono state nel tempo alcune modifiche allo standard; ad 
esempio ho visto che esistono delle versioni "safe" di funzioni che 
usavo io, tipo ho visto che ora esistono ad esempio fopen_s, sscanf_s, 
ecc. L'ho scoperto usando Visual Studio 17 e mi pare di aver capito che 
queste funzioni sono ora entrate a far parte dello standard. Pero' ora 
avrei bisogno di scrivere codice e compilarlo sotto Linux ma
a quanto pare gcc, almeno quello che ho io, non sembra supportare queste 
funzioni.
 
Quindi il dubbio e': sono io che ho una versione di gcc non aggiornata o 
e' proprio gcc che non e' compliant con lo standard del linguaggio ?
 
Oppure devo includere/linkare qualche header/libreria ?
 
Ciao,
Marco
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

On 11/23/18 11:22 AM, Marcoxxx wrote:
 > Oppure devo includere/linkare qualche header/libreria ?
 
 
 
Guarda (in particolare l'ultima risposta):
 
 > 
https://stackoverflow.com/questions/1513209/is-there-a-way-to-use-fopen-s-with-gcc-or-at-least-create-a-define-about-it
 
 
 
 
N.B. Non ho provato.

     ret=fopen_s(&f,"tutto_marco.txt","r");
 
`fopen_s` non e` una funzione standard. gcc evidentemente non la implementa. Se e` questa 
https://msdn.microsoft.com/en-us/library/z5hh6ee9.aspx
 devi usare il compilatore incluso in .NET.

 `fopen_s` non e` una funzione standard
 
Sembra che lo sia da C11, ma immagino che a usare C11 siano in tre.
 


Beh, si' quello che si trova nel link e' simile ad altre cose che avevo 
visto in giro, cioe' qualche tentativo di scriversi la propria fopen_s 
con signature uguale  a quella che dovrebbe essere standard e usare la 
fopen_s definita "in proprio", ma se bisgna per forza fare cosi' allora 
significa che gcc non e' compiliant con lo standard del linguaggio
(se lo fosse, dovrebbe fornire lui una versione della fopen_s da poter 
usare senza doversi scrivere la propria versione).


 senza doversi scrivere la propria versione).
 
ti avrebbe detto di guardare l'ultima risposta, però.

Sai leggere? Devi abilitare il supporto di C11. Quella funzione non è supportata dalle versioni precedenti.

Il 23/11/18 04:22, Marcoxxx ha scritto:

fopen_s e si parte di c11 ma non e' obbligatoria
la macro __STDC_LIB_EXT1__  se e' definita allora significa che e' 
implementata
Per usarla devi definire la macro __STDC_WANT_LIB_EXT1__ a valore 1 
prima di includere stdio.h
PS:
se ci sono compilatori che seguono gli std la suite gcc e' una di quelle
MS solo in questi tempi sta adeguando il suo visual c++ agli std,sul C 
non ti so dire
 
 
 

 con signature uguale  a quella che dovrebbe essere standard e usare la 
 
Non solo.
 
All'ultimo messaggio e' spiegato anche come abilitare fopen_s su GCC.
Ripeto, leggi l'*ultimo* messaggio.

 prima di includere stdio.h
 
Ho letto l'ultimo messaggio del link postato, che effettivamente mi era 
sfuggito.
 
 
Nel link che era stato postato si parlava di
STDC_WANT_LIB_EXT1, non di  __STDC_WANT_LIB_EXT1__
 
in ogni caso ho provato a inserire sia
 
#define STDC_WANT_LIB_EXT1 1
 
che
 
#define __STDC_WANT_LIB_EXT1__ 1
 
prima di #include <stdio.h>
 
ma in entrambi i casi ottengo lo stesso identico errore di prima.
 
 
Ho provato anche brevemente a cercare se nei vari header
ci fosse una dichiarazione della fopen_s o delle STDC_LIB_EXT1
o STDC_WANT_LIB_EXT1 (o comunque un qualche utilizzo, tipo
 
#ifdef __STDC_WANT_LIB_EXT1
....
#endif
 
ma pare che ne' la funzione ne' le macro
siano dichiarate ne' utilizzate da alcuna parte.
Invece ad esempio la dichiarazione di fopen si trova
 
marco@marco-VirtualBox:~$ grep fopen /usr/include/*
...
/usr/include/mntent.h:   beginning of FILE.  MODE is as for `fopen'.  */
...
/usr/include/stdio.h:extern FILE *fopen (const char *__restrict __filename,
/usr/include/stdio.h:extern FILE *__REDIRECT (fopen, (const char 
*__restrict __filename,
/usr/include/stdio.h:				 const char *__restrict __modes), fopen64)
/usr/include/stdio.h:#  define fopen fopen64
/usr/include/stdio.h:extern FILE *fopen64 (const char *__restrict 
__filename,
/usr/include/stdio.h:extern FILE *fopencookie (void *__restrict 
__magic_cookie,
...
/usr/include/zlib.h:   in fopen ("rb" or "wb") but can also include a 
compression level ("wb9") or
/usr/include/zlib.h:   has been previously opened with fopen).  The mode 
parameter is as in gzopen.
...
 
 
 
 
 > PS:
 > se ci sono compilatori che seguono gli std la suite gcc e' una di quelle
 
Per questo mi era sembrato strano che non ci fosse.
Comunque se non e' obbligatoria può darsi che abbiano deciso di non 
implementarla. Va beh, per ora ho usato la vecchia fopen (poi se ne 
avro' voglia mi definiro' una fopen_s mia)
 
 > MS solo in questi tempi sta adeguando il suo visual c++ agli std,sul C
 > non ti so dire
 >
Beh', se negli ultimi anni non hanno eliminato la possibilita', in C++ 
si potrebbe anche non usare fopen, utilizzando ad esempio gli fstream
(ai tempi, di solito in c++ usavo questi)


 implementarla.
 
"Non obbligatoria" non significa niente (un'altra cazzata scritta da enoquick). Si parla di funzioni standard o non-standard.
 

 
 
 
 
non e' che se definisci __STDC_WANT_LIB_EXT1__ a 1 automaticamente hai 
fopen_s
 
Credo di essere stato chiaro:
 >> la macro __STDC_LIB_EXT1__  se e' definita allora significa che e'
 >> implementata
 
e' questa che devi testare prima (con #if )
 
#ifdef __STDC_LIB_EXT1__
// ok posso usare fopen_s
#else
#error non posso usare fopen_s
#endif
 
ti dico subito,cosi non fai una prova inutile,che gcc non implementa 
fopen_s
 
Se non vuoi o puoi cambiare i  programmi occorre definirla come macro
basandoti su fopen
altrimenti se puoi ed e' conveniente farlo modifica il o i programmi
 
[CUT]

On 25/11/18 17:00, 4ndre4 wrote:> On Sunday, 25 November 2018 14:34:12 
UTC, Marcoxxx  wrote:
 >
 > [...]
 >> Per questo mi era sembrato strano che non ci fosse.
 >
 > E` standard C11, che e` supportato abilitando un flag. Flag che, se 
tu avessi letto quanto ti e` stato postato, sapresti qual e`.
 >
 
 
Toh... guarda chi si rivede.
 
Ti avevo inserito (insieme ad altri) nel killfile da tempo, visto che le 
tue risposte, dal mio punto di vista, erano quasi sempre inutili come 
questa e le tue domande erano spesso fastidiose oltre spesso a non 
entrarci praticamente niente con l'argomento del thread. Visto che sto 
usando per la prima volta il newsreader della macchina virtuale non ho 
ancora aggiornato il killfile e per la verita' mi ero ripromesso di 
cercare di non metterci nessuno. Comunque vedro' come va e in caso 
provvedero' a breve.
 
Nel frattempo ti informo che se tu sapessi leggere, avresti letto il 
primo post di questo thread e avresti visto che ho provato sia ad usare 
il flag che a non usarlo(flag che conoscevo senza che qualcuno mi 
dicesse quale era. Se poi ti potesse venire il dubbuio, ho provato sia 
con il - che con il --)
 
 >> Comunque se non e' obbligatoria può darsi che abbiano deciso di non
 >> implementarla.
 >
 > "Non obbligatoria" non significa niente (un'altra cazzata scritta da 
enoquick). Si parla di funzioni standard o non-standard.
 >
 
Io avevo interpretato quello che diceva enoquick ("non obbligatoria") 
come una cosa del tipo: "lo standard la prevede ma dice che la sua 
implementazione e' opzionale"
(poi non so se sia vero o meno, visto che effettivamente i documenti 
dello standard non li ho letti e non so nemmeno che senso avrebbe
dichiarare una funzione opzionale nello standard [ma visto che sono 
fuori dal giro da piu' di 5 anni e fuori dalla programmazione 
probabilmente da piu' di 10, non me ne meraviglierei]. L'ho solo preso 
per buono).
 
 
Comunque  visto che pare che tu  dica che e' parte dello standard
nel senso che un compilatore compliant con lo standard dovrebbe 
obbligatoriamente linkarla (usando tutti i flag e macro necessarie)
mi sapresti dire in quale header e' contenuta la dichiarazione di tale 
fopen_s (o, se non e' in un header, dove e') ? Io l'ho cercata ma non 
l'ho trovata.
 
Perche', macro o non macro, flag o non flag, se non e' dichiarata da 
qualche parte (e definita da qualche parte), immagino che utilizzarla 
sia un po' difficile pur utilizzando tutti i flag e tutte le macro del 
mondo.
 
In ogni caso, se e' nello standard, non e' "opzionale" e gcc non la 
implementa, penso di poter considerare corretta la mia impressione 
iniziale: gcc non e' compliant con lo standard c11
(tra l'altro ora ho visto che da quest'anno dovrebbe esistere anche un 
c18, ma per la verita' non ho minimamente approfondito. Magari il c18 la 
potrebbe aver rimossa dallo standard, anche se mi sembrerebbe strano. In 
quel caso gcc potrebbe essere compliant con c18. Comunque non credo che 
indaghero' ulteriormente. Per i miei scopi e' piu' che sufficiente 
quanto appurato).
 
Ciao,
Marco.

 iniziale: gcc non e' compliant con lo standard c11
 
Il problema e` che tu non leggi, ma sopratutto non capisci:
 
https://stackoverflow.com/questions/16256586/how-to-enable-c11-on-later-versions-of-gcc
 
 
E il bello e` che accusi gli altri di dare risposte inutili. Che testa :)

 fopen_s
 
 >
  In realta' la prova l'avevo gia' fatta, anche cercando "a mano" la 
dichiarazione di fopen_s e delle macro nei vari header, senza trovarla.
 
 > Se non vuoi o puoi cambiare i  programmi occorre definirla come macro
 > basandoti su fopen
 > altrimenti se puoi ed e' conveniente farlo modifica il o i programmi
 >
 > [CUT]
 
Bah, e' solo un programmetto che serve solo a me per fare qualche 
elaborazione su file di testo, tipo suddividere i dati, creando magari
un file per ogni anno, calcolare qualche media e poche altre cose.
 
Praticamente un software "usa e getta" che quando ha funzionato una 
volta si può anche buttare.
 
Era piu' che altro la curiosita' di vedere, credo per la prima volta, 
almeno per quanto mi riguarda, che un
prodotto microsoft fosse probabilmente piu' aderente agli standard che 
non gcc.
 
E un po' anche la vecchia deformazione professionale di cercare di 
essere aderente agli standard.
 
 
Ciao,
Marco.


Il 26/11/18 06:58, Marcoxxx ha scritto:

se vuoi cercare gli std non cercare MS
Credo che la suite gcc e clang siano i piu aderenti agli std