scandir与alphasort未声明编译错误排查求助
解决MinGW下scandir/alphasort未声明的编译错误
问题原因
MinGW的dirent.h默认不会暴露scandir、alphasort这类POSIX扩展函数的声明,必须通过定义特定宏来启用这些函数的头文件声明。
两种解决方法
方法一:修改代码添加宏定义
在所有头文件包含之前,添加_POSIX_C_SOURCE宏定义,指定足够高的POSIX版本(比如200809L),让头文件导出所需函数声明:
#define _POSIX_C_SOURCE 200809L #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <dirent.h> int main(int argc, char const *argv[]){ struct dirent **namelist; int n; n = scandir(".", &namelist, NULL, alphasort); printf("Number Files %d\n", n); if (n == -1){ perror("scandir"); exit(EXIT_FAILURE); } while (n--){ printf("%s\n", namelist[n]->d_name); free(namelist[n]); } free(namelist); // 补充释放顶层指针,避免内存泄漏 }
方法二:编译时通过选项传递宏
不用修改代码,编译时加上-D_POSIX_C_SOURCE=200809L参数,直接告诉编译器启用POSIX扩展声明:
gcc your_code.c -o your_program -D_POSIX_C_SOURCE=200809L
额外提示
原代码遗漏了对namelist本身的内存释放,加上free(namelist);可以避免内存泄漏。
内容的提问来源于stack exchange,提问作者ThisPotatoGuy
相关产品推荐
相关产品推荐

