GCC环境下C++调用localtime_s失败及函数位置查询
问题根因
你遇到的编译报错是GCC配套的glibc库本身的特性导致的:
- glibc 从未实现C11标准 Annex K 中定义的
localtime_s等带_s后缀的安全函数,无论你是否定义__STDC_WANT_LIB_EXT1__宏、无论你编译C还是C++代码、无论用-std=c11还是-std=c++17参数,都无法找到这个函数。 - 补充说明:即使有环境支持
localtime_s,你当前写的参数顺序也不符合C11标准要求:标准定义的参数顺序为localtime_s(tm结构体指针, time_t指针),和你写的顺序刚好相反;Windows MSVC自带的localtime_s参数顺序和C标准也不一致,跨平台使用时需要注意区分。
可行解决方案
Linux/GCC环境下直接使用POSIX标准提供的localtime_r函数即可,它是线程安全的,功能和localtime_s完全一致,且参数顺序刚好匹配你当前的写法,直接替换函数名就能编译通过:
#define __STDC_WANT_LIB_EXT1__ 1 #include <time.h> using SystemClock = std::chrono::system_clock; const auto in_time_t = SystemClock::to_time_t(SystemClock::now()); struct tm buf; // 把localtime_s替换为localtime_r即可 localtime_r(&in_time_t, &buf);
如果需要做跨平台兼容,可以加一层宏封装,区分不同平台调用对应的安全接口。
内容的提问来源于stack exchange,提问作者S.V
相关产品推荐
相关产品推荐

