[C++] GCC - error: 'localtime_s' was not declared in this scope

di il
7 risposte

[C++] GCC - error: 'localtime_s' was not declared in this scope

Buongiorno,

ho il seguente semplicissimo programmino, che viene compilato (ed eseguito) correttamente con VS2019 ma non con GCC (installato con cygwin).
#define __STDC_WANT_LIB_EXT1__ 1
#include <ctime>
#include <chrono>
#include <string>
#include <iostream>

using namespace std;

int main () {
	char dateTimeStr[20];
	struct tm buf;
	time_t t = time(NULL);
	//localtime_s(&buf, &t); // Microsoft CRT version
	localtime_s(&t, &buf); // C++ standard library version
	strftime(dateTimeStr, 20, "%F %T", &buf);
	chrono::milliseconds milliSecond = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch());
	string milliSecondStr = to_string(milliSecond.count());
	milliSecondStr = milliSecondStr.substr(milliSecondStr.size() - 3);
	cout << string(dateTimeStr) + "." + milliSecondStr + " TEST";
}
Questo é l'output del comando di compilazione
g++ -Wall -Wextra -Wpedantic test.cpp -o test
test.cpp: In function 'int main()':
test.cpp:14:2: error: 'localtime_s' was not declared in this scope
  localtime_s(&t, &buf); // C++ standard library version
  ^~~~~~~~~~~
test.cpp:14:2: note: suggested alternative: 'localtime_r'
  localtime_s(&t, &buf); // C++ standard library version
  ^~~~~~~~~~~
  localtime_r
Come riportato nella pagina di riferimento della standard library C++, ho aggiunto la direttiva #define __STDC_WANT_LIB_EXT1__ 1.

Qualcuno sa darmi qualche suggerimento per risolvere questo problema?

Grazie in anticipo a chi saprá aiutarmi.

Ciao.

7 Risposte

  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    La pagina di riferimento, però, dice anche che serve almeno la flag -std=c++11
  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    Weierstrass ha scritto:


    La pagina di riferimento, però, dice anche che serve almeno la flag -std=c++11
    Correggo, -std=c11 o -std=c++14
  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    Grazie per la risposta Weierstrass. Ho provato a compilare usando il comando seguente, ma ottengo purtroppo lo stesso errore...
    g++ -std=c++14 -Wall -Wextra -Wpedantic test.cpp -o test

    _Achille ha scritto:


    Weierstrass ha scritto:


    La pagina di riferimento, però, dice anche che serve almeno la flag -std=c++11
    Correggo, -std=c11 o -std=c++14
    In realtá il flag -std=c11 é applicabile solamente a sorgenti C o ObjC.
  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    __STDC_LIB_EXT1__ è definito? Controlla
  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    _Achille ha scritto:


    __STDC_LIB_EXT1__ è definito? Controlla
    No, non é definito.
  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    VegetaSSJ5 ha scritto:


    _Achille ha scritto:


    __STDC_LIB_EXT1__ è definito? Controlla
    No, non é definito.
    O utilizzi C11, o MSVC o utilizzi std::localtime_r o std::localtime
  • Re: [C++] GCC - error: 'localtime_s' was not declared in this scope

    _Achille ha scritto:


    O utilizzi C11, o MSVC o utilizzi std::localtime_r o std::localtime
    Come detto C11 non posso usarlo, e provando con C++11 e C++14 comunque la funzione non viene riconosciuta dal compilatore.
    std::localtime_r non é cross platform (non esiste in MSVC)
    ... effettivamente anche std::localtime_s non é implementata da MSVC in maniera standard, visto che ha l'ordine degli argomenti invertiti, rispetto alla standard library.

    Alla fine ripiego per std::localtime e, giacché ci sono, posto anche il sorgente di una funzione che stampa il timestamp corrente (con millisecondi).

    Grazie a tutti coloro che sono intervenuti nella discussione.
    using namespace std;
    
    string getTimestampString(const chrono::time_point<chrono::system_clock>& chrono_t) {
    	time_t timer = chrono::system_clock::to_time_t(chrono_t);
    #pragma warning(suppress : 4996)
    	struct tm* buf = localtime(&timer);
    
    	chrono::milliseconds ms = chrono::duration_cast<chrono::milliseconds>(chrono_t.time_since_epoch()) % 1000;
    	ostringstream oss;
    	oss << put_time(buf, "%F %T") << '.' << setfill('0') << setw(3) << ms.count();
    	return oss.str();
    }
Devi accedere o registrarti per scrivere nel forum
7 risposte