Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C S_ISREG宏未定义_C_Curl_Macros - Fatal编程技术网

C S_ISREG宏未定义

C S_ISREG宏未定义,c,curl,macros,C,Curl,Macros,问题 posix宏S_ISREG、S_ISDIR等是否仅限于linux?我需要找出原因,因为我正在尝试编译,而且它正在尝试在windows上使用它们我可以在windows上使用哪些包含文件来访问它们。 这是令人不快的代码 /*we ignore file size for char/block devices, sockets etc*/ if(S_ISREG(fileinfo.st_mode)) uploadfilesize= fileinfo.st_size; } 它会导致一个错误

问题

  • posix宏S_ISREG、S_ISDIR等是否仅限于linux?我需要找出原因,因为我正在尝试编译,而且它正在尝试在windows上使用它们
  • 我可以在windows上使用哪些包含文件来访问它们。

这是令人不快的代码

/*we ignore file size for char/block devices, sockets etc*/
if(S_ISREG(fileinfo.st_mode))
   uploadfilesize= fileinfo.st_size;
}
它会导致一个错误

error LNK2019: unresolved external symbol _S_ISREG referenced in function _operate file tool_operate.obj
以下问题中引用了它们


显然,S_ISREG()是一组posix宏的一部分,显然应该告诉我们一个文件是否是“常规文件”,但我发现的所有示例都有特定于linux的include文件

在windows上尝试添加下划线(
\u S\u ISREG
)。在MinGW的库中,也可以在


也许你应该检查一下你的配置宏。

在windows上没有这样的东西,你可以使用FindFirstFile,FindTextFile win32 api,返回结构包含一些相似但不相同的东西


如果您使用gcc/mingw库,则它们具有stat()模拟。您需要为该宏包含sys/stat.h。

当前curl 7.21.5在setup.h中定义了以下内容:

#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif

在检查了微软的sys/stat.h之后,我发现对@OliverZendel答案的以下修改对我很有用,对Visual Studio 2017也很有希望,对其他编译器也是如此:

// Windows does not define the S_ISREG and S_ISDIR macros in stat.h, so we do.
// We have to define _CRT_INTERNAL_NONSTDC_NAMES 1 before #including sys/stat.h
// in order for Microsoft's stat.h to define names like S_IFMT, S_IFREG, and S_IFDIR,
// rather than just defining  _S_IFMT, _S_IFREG, and _S_IFDIR as it normally does.
#define _CRT_INTERNAL_NONSTDC_NAMES 1
#include <sys/stat.h>
#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
  #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR)
  #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
//Windows没有在stat.h中定义S_ISREG和S_ISDIR宏,所以我们这样做了。
//我们必须在包含sys/stat.h之前定义_CRT_INTERNAL_nonsdc_name 1
//为了让微软的stat.h定义像s_IFMT、s_IFREG和s_IFDIR这样的名称,
//而不是像通常那样定义_S_IFMT、_S_IFREG和_S_IFDIR。
#定义\u CRT\u内部\u非DC\u名称1
#包括
#如果!已定义(S_ISREG)和已定义(S_IFMT)以及已定义(S_IFREG)
#定义S_ISREG(m)((m)和S_IFMT)=S_IFREG)
#恩迪夫
#如果!已定义(S_ISDIR)和已定义(S_IFMT)以及已定义(S_IFDIR)
#定义S_ISDIR(m)((m)和S_IFMT)=S_IFDIR)
#恩迪夫

这不是我的代码。它是curl代码的一部分,在tool_operate.c中的链接步骤中生成错误。需要什么include文件或应该链接什么库?您在哪里找到了_S_ISREG?这是MinGW特有的吗?VS2010没有它的_ISREG是对POSIX宏的模拟。对于Win32,应使用MSVC/MSDN指定的API。我在MinGW的所有标题中使用文本模式搜索找到了下划线。在检查了Microsoft的sys/stat.h for VS2017之后,我觉得s_ISREG和s_ISREG都不会被它定义。但是,已经定义了足够多的常量,如_S_IFMT和_S_IFREG(如果_CRT_INTERNAL_nonsdc_name被定义为1,则还定义了S_IFMT和S_IFREG),以允许您定义自己的S_ISREG。请参阅下面我的答案。“posix宏是否仅限于linux?”不,您自己在这个问题中说:“posix宏”。它们在每一个符合POSIX标准的系统上。获得预编译的Windows版本不是更容易吗?应该不太难找到。否则,如何配置用于构建的CURL?什么环境(VisualStudio,Cygwin,MinGW?)有趣的是,似乎没有人注意到链接错误是关于下划线前缀_S#u ISREG的,这就是为什么curl的#define没有触发:很可能S#u ISREG已经定义并且引用了_S#u ISREG。我的猜测是,包含将使它能够编译。我有同样的S_ISREG undefine问题,但我不明白答案。我可以看到sys/stat.h已经包含在setup_once.h中,setup.h应该已经包含了它。我到底需要做什么来解决这个问题?您使用的是哪个编译器?MSVC。我通过将#include setup_once.h语句移动到S#u ISREG定义之前来编译它,这样它将获取S#u IFREG defn。不确定这是否是正确的修复方法。如果使用MSVC,则应使用windows API而不是unix stat()。e、 g.需要说明的是,sys/stat.h和stat功能确实存在于Windows上(至少VS2017)。缺少的是s_ISREG宏(以及类似的宏,如s_ISDIR)。但是,您可以自己添加它们。见下面我的答案。如果可以在包含sys/stat.h(例如“mystat.h”)的头文件中执行此操作,则可以在源文件中使用stat函数使用可移植代码,而无需在每次需要检查文件状态时对操作系统特定的API(如FindFirstFile)执行“ifdef”。(令人费解的是,微软包含了sys/stat.h,但只包含了其中的一些内容。)在VS2017中,我可以使用MSVC编译器,并使用上面的代码使用S_ISREG。这应该被标记为正确答案。这对我不起作用,但我发现它的一个修改在VS2017中起了作用。见下面我的答案。