为什么 MinGW gcc 8.2.0 `-std=c11` 不支持 `timespec_get()`?

Max*_*ann 6 c iso mingw c11

参考2011 年 4 月 12 日发布的 ISO/IEC 9899:201x 编程语言 - C的 N1570 委员会草案,应该有一个函数timespec_get()(参见 7.27.2.5)。

但当使用 编译以下代码片段时,MinGW gcc 版本 8.2.0 返回warning: implicit declaration of function 'timespec_get', 和:error: 'TIME_UTC' undeclaredgcc -std=c11 snippet.c

#include <time.h>

int main() {
   struct timespec tstart;
   timespec_get(&tstart, TIME_UTC);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是为什么?

小智 0

除了 之外-std=c11,您还应该使用-D_UCRT编译器和-lucrt链接器的选项。有有效的 CMakeLists.txt 和 cmake 调用

$ cat CMakeLists.txt 
cmake_minimum_required (VERSION 3.10)
project(timespec_get)

set(EXE_NAME test)
set(MAIN_SOURCES 
    ${PROJECT_SOURCE_DIR}/src/test.c
)

add_executable(${EXE_NAME} ${MAIN_SOURCES})
if (${MINGW})
    set(CMAKE_C_FLAGS "-W -Wall -Wextra -std=c11 -D_UCRT")
    target_link_libraries(${EXE_NAME} -lucrt)
else ()
    set(CMAKE_C_FLAGS "-W -Wall -Wextra -std=c11")
endif ()
Run Code Online (Sandbox Code Playgroud)

cmake 调用:

cmake -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw64.cmake
Run Code Online (Sandbox Code Playgroud)

和结果

$ make
[ 50%] Building C object CMakeFiles/test.dir/src/test.c.obj
[100%] Linking C executable test.exe
[100%] Built target test
Run Code Online (Sandbox Code Playgroud)