函数'int mkdir(const char*)'的参数过多

10

我正在尝试在Windows下编译一个Linux程序(我使用mingw)

void make_directory(const char* name) {
  mkdir(name1, name2);
}

这里出现了一个错误:

Too Many Arguments to function 'int mkdir(const char*)'

有什么方法可以解决这个问题吗?


6
mkdir函数只接受一个参数,但是您正在传递两个参数或者传递了不兼容的数据类型。 - Jack
3
请考虑添加 C 标签。如果这里的 mkdir() 是某个 API 的一部分,需要提供库/API名称和您的环境,例如 Linux/POSIX 等。 - Jack
3个回答

9
正如评论中所说,mkdir()只需要一个参数。但是由于此函数已被弃用,您应该使用_mkdir()代替:
int _mkdir(const char *dirname); 
int _wmkdir(const wchar_t *dirname); /* for wide-character */

如果您希望在Linux和Mingw两个系统上使用您的函数:
void make_directory(const char* name)
{
#ifdef __linux__
    mkdir(name, 777); /* Or what parameter you need here ... */
#else
    _mkdir(name);
#endif
}

编辑:

MinGW 实现:

_mkdir():

_CRTIMP int __cdecl __MINGW_NOTHROW _mkdir (const char*);

mkdir():

_CRTIMP int __cdecl __MINGW_NOTHROW mkdir (const char*);

这两个都在 io.h 中指定,但我想最好包含 direct.h(它包含了 io.h 的一部分)。


1
mkdir()是POSIX标准函数。它被微软弃用了;我不确定微软对此事的看法应该被认真对待到什么程度。 - Keith Thompson
1
而 POSIX 的 mkdir() 函数实际上需要 两个 参数;有关详细信息请参阅我的答案。 - Keith Thompson
7
是的,这是对POSIX标准的要求。但是MinGW实现(请参见我帖子的编辑)只接受一个参数。因此,你需要区分使用Windows(MinGW)或Linux系统时选择的函数。 - ollo
4
据我了解,MinGW只是使用了微软的运行时库,所以真正接收单个参数的函数是微软的 mkdir()。微软和POSIX有一些同名但不兼容的函数确实很令人遗憾,但两者的历史可以追溯到早期的UNIX和MS-DOS,因此也并不意外。因此,微软正在弃用其自己的 mkdir() 函数,考虑到名称冲突,这可能是件好事。(至于选择 _mkdir() 作为新名称的观点,我会保留我的看法。) - Keith Thompson
4
没问题,MinGW是“Windows下的GCC”。像这个函数一样的操作系统功能来自于C运行时库(_CRTIMP)。 - ollo
“777” 应该是 “0777” 吧。虽然我没有太多经验,但我认为权限应该是用八进制值指定的位掩码。 - KANJICODER

8

在 mingw-w64 下构建 Linux 已有程序时,我成功地做到了这一点:

#if (defined(_WIN32) || defined(__WIN32__))
#define mkdir(A, B) mkdir(A)
#endif

1
我不得不在MinGW库的if/endif中添加包含:#include <direct.h> /* _mkdir */ 并使用_mkdir而不是mkdir。 - thoroc

3
我将假设name1name2都是您想要创建的目录名称(但请参见下文)。 mkdir() 创建一个(或尝试创建一个)单个目录。如果您想要创建两个目录,则需要调用mkdir()两次。
并且为了增加混淆,POSIX mkdir()函数实际上需要两个参数--但第二个参数不是名称。在我的系统上引用手册页面上的话:
#include <sys/stat.h>
#include <sys/types.h>

int mkdir(const char *pathname, mode_t mode);

在ollo的回答中提到的_mkdir()函数是专门针对Microsoft Windows的,它只需要一个参数;在Windows上,权限(即模式)的工作方式与POSIX(Unix、Linux等)系统不同。但是,你的编译器显然认为mkdir()只需要一个参数,这让人想知道它为什么会这样认为。你使用了哪个头文件来获取mkdir函数的声明?如上所述,POSIX的mkdir()需要两个参数,但第二个参数是mode_t,而不是名称。你说这段代码最初是为Linux编写的。这些参数真的叫做name1name2吗?还是你试图通过更改名称来简化代码?你能否更新问题,向我们展示实际复制和粘贴的代码?

自2012年8月以来,OP在stackoverflow上没有出现过,因此我们可能不会看到任何关于这个问题的更新。 - Keith Thompson
1
我知道,但也许对其他人有所帮助。 - ollo
顺便说一下,这篇帖子很有趣,点赞。 - ollo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接