Stringa di conversione con "%lld" in C++: si può?

di il
4 risposte

Stringa di conversione con "%lld" in C++: si può?

Facendo degli "esperimenti impropri", sto cercando di usare dei valori di tipo int64_t con printf() nel contesto di un programma di prova contenuto in un file .cpp. Per farlo, nella stringa di conversione uso la combinazione di caratteri "%lld" (utilizzabile, da quel che ho letto, da C99 in poi), ottenendo un grazioso messaggio d'avvertimento: "warning: unknown conversion type character 'l' in format [-Wformat=]". Il programma viene comunque compilato e PARE funzionare.

Qualche anima buona mi sa spiegare se "%lld" è effettivamente utilizzabile anche in C++ oppure no e se no perché? Posso o non posso usare int64_t in printf? Se sì, come? (in C lo uso senza nessun messaggio d'avvertimento attivando nelle opzioni di compilazione in Code::Blocks con gcc la voce 'have gcc follow the 1999 ISO C language standard [-std=C99]')

4 Risposte

  • Re: Stringa di conversione con "%lld" in C++: si può?

    Se compili in C++ devi mettere anche -std=C++11 perché %lld è supportato a partire da quello standard.
    Se il compilatore è relativamente recente puoi mettere -std=C++14 (o se recentissimo -std=C++17)
  • Re: Stringa di conversione con "%lld" in C++: si può?

    Grazie per l'offerta di aiuto.
    In effetti avevo già provato ad attivare le varie "opzioni" da C++11 fino a C++17, ma il problema persisteva.

    Mentre aspettavo di vedere se qualche anima buona mi avrebbe aiutato, ho insistito nelle ricerche ed ho trovato questa pagina: https://stackoverflow.com/questions/6400180/how-to-printf-long-long
    %lld is the standard C99 way, but that doesn't work on the compiler that I'm using (mingw32-gcc v4.6.0). The way to do it on this compiler is: %I64d

    So try this:

    if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

    and

    scanf("%I64d", &n);

    The only way I know of for doing this in a completely portable way is to use the defines in <inttypes.h>.

    In your case, it would look like this:

    scanf("%"SCNd64"", &n);
    //...
    if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

    It really is very ugly... but at least it is portable.
    Più avanti altri intervengono tirando in ballo strane interazioni tra la msvcrt.dll e mingw dalle quali pare di capire che sia all'opera una qualche interazione tra procedure non ancor ben uniformate sul compilatore che sto usando. In ogni caso, il "trucchetto" suggerito funziona... chissà però se c'è qualche sistema più "ufficiale"...
  • Re: Stringa di conversione con "%lld" in C++: si può?

    Con mingw 7.2.0 64 bit non ho di questi problemi. Prova ad aggionare il compilatore.
  • Re: Stringa di conversione con "%lld" in C++: si può?

    Sto usando Code::Blocks nella sua ultima versione, che viene distribuito con MinGw a 32bit. Inoltre, uso un PC a 32 bit (come, credo, tanti altri). Dunque la "questione" non si risolve con un aggiornamento. E poi, diciamocelo, sono un po' troppo "fitti" questi aggiornamenti pressoché "obbligatori"...
Devi accedere o registrarti per scrivere nel forum
4 risposte