S_ISREG宏未定义

时间:2012-06-28 06:08:02

标签: c curl macros

问题

  • 是posix宏S_ISREG,S_ISDIR等linux吗?我需要找出因为我正在尝试编译CURL并且它正在尝试在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特定的包含文件。

4 个答案:

答案 0 :(得分:3)

在Windows上没有这样的东西,你可以使用FindFirstFile,FindNextFile win32 api,返回结构包含类似但不一样的东西。

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

答案 1 :(得分:3)

目前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

答案 2 :(得分:2)

检查了Microsoft的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

答案 3 :(得分:1)

在Windows上尝试添加下划线(_S_ISREG)。在MinGW的lib中,S_ISREG

中也可以访问<sys/stat.h>

也许您应该检查配置宏。