我正在用 C 编写一些代码,遇到了一个问题 - 即使我已经sys/stats.h
定义了标题,当我使用时S_IFREG
,它也会给我错误“使用未声明的标识符” S_IFREG
。在谷歌搜索后,它告诉我这不是可以在 Windows 上使用的东西,而我使用的是 Windows。我找不到在 Windows 上等效的东西的明确答案,所以我想知道是否有人可以帮助我。这是我的代码:
int function( command_t* p_cmd ) {
char path[MAX_ARG_LEN];
strcpy(path, getenv("PATH"));
char *token = strtok(path, ":");
while(token != NULL){
char parameter[MAX_ARG_LEN];
strcpy(parameter, token);
strcat(parameter, "/");
strcat(parameter, p_cmd->argv[0]);
struct stat buffer;
int exists;
exists = stat(parameter, &buffer);
if(exists == 0 && (S_IFREG & buffer.st_mode)){
strcpy(p_cmd->argv[0] , parameter);
return 1;
}
token = strtok(NULL, ":");
}
return 0;
}
这些是我正在使用的标题,我无法改变它们来添加额外的库。
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
我还无法改变参数或使用任何扩展。
答案1
答案从编辑移至问题:
本质上,现代 POSIX 兼容系统需要 S_IFMT 和 S_IFREG 值,但 POSIX.1-1990 不需要,实际上禁止您包含它们。在我的第一段代码中,我手动屏蔽以检查文件:
(S_IFREG & buffer.st_mode)
但是 POSIX 兼容系统提供的宏已经为您完成了这个,所以代码应该是:
S_ISREG(buffer.st_mode)