写 int main(int argc, char *argv[]) 是必须的吗?不能使用其他名称替代 argc 和 *argv[] 吗?

5
我在Visual Studio的项目选项中(在“配置属性”->“调试”中)给出命令行参数遇到了一些麻烦。
当我写了"int main(int main_i)"无效后,我写了"int main(int argc)"。在MS Visual Studio属性页面的项目命令行参数中,我不确定应该写什么。我只想传递一个整数来指定是读取还是写入文件,因此只需要一个简单的int argc。我不需要char*argv[]。我已经在命令行参数文本框中尝试了一些值,但它并没有在执行时到达exe文件,它显示我根本没有输入。
你能给我提供一个简单的例子,在MSVS C++属性页面的命令行参数空间中需要输入什么吗?我简直找不到任何关于如何给MSVS提供命令行参数的例子。
我也不明白为什么我仅仅修改了命令行参数值,为什么还需要重新构建整个项目?

传递给您的程序的整数不会进入 argc。请再次阅读该教程。 - user529758
6个回答

12

如果你想让你的程序理解一个单独的整数命令行参数,你仍然需要使用argcargv。下面这样做应该可以:

int main(int argc, char *argv[]) {

    if (argc < 2) {
        fprintf(stderr, "Need a command line argument.\n");
        exit(1);
    }

    int arg = atoi(argv[1]);
    // now you have an integer
    // do whatever with it...
}

C标准要求main函数具有特定的参数集。 允许的组合之一是(int,char * [])。 您可以将参数命名为任何您想要的名称,但它们几乎总是称为argcargv


6

这些名称仅是一项成熟的约定,您可以使用任何名称(尽管可能会引起注意),但我只见过按指定顺序同时使用两个参数的代码。

在ANSI之前的日子里,仍然可以简单地使用int main(),并且现在也是如此..但这些天通常会提供argc argv

您不能仅提供其中一个参数。


在后ANSI时代,仍然有可能使用int main()(你似乎已经暗示了这一点)。 - Seth Carnegie
1
@SethCarnegie,你认为我需要更明确地说明吗?我想通过鼓励使用argcargv来推广“良好的实践”。 - Levon
我认为使用 argcargv 不一定是一个好的实践。有时候你需要它,有时候你不需要。我之所以提到这个问题,是因为如果你说它“曾经”可能是可行的,那么就意味着现在不行了,但实际上它仍然可以使用(标准甚至在示例中使用它)。 - Seth Carnegie
@SethCarnegie 我会重新措辞的,谢谢你的反馈。 - Levon

5

变量名称仅供编译器使用。它们将在二进制图像中转换为地址。您可以向主函数传递最多3个参数。

以下是我尝试的内容 -

int main(int i, char* a[], char* e[])

正如你所看到的,这些名称并不是普通的名称。

第一个参数是命令行参数的数量,第二个参数是实际的参数数组,第三个参数是环境变量数组。

事实上,main函数可以接受任意数量的参数,但是在第三个参数之后的所有参数都将无效。以下代码仍然可以编译 -

int main(int i, char* a[], char* e[], char* j[])

为了好玩,你甚至可以这样做 -

int main(int i, float a, float b, float c, float d, float e)

1
实际上,除了int main()int main(int, char*[])之外的所有其他main函数都不能保证能正常工作。 - Seth Carnegie
@SethCarnegie 是的(标准说是这样)!但是除非您在DS9k上构建,否则它会发生。 - user529758
@H2CO3,我就喜欢在标准里查资料。 - Seth Carnegie
1
@SethCarnegie:没错。标准还指出了以下内容 - [注意:建议在 argv 后添加任何其他(可选)参数。] 我相信所有编译器都支持至少 3 个参数。 - Superman

4

即使是一个简单的main函数也允许,你仍然可以访问那些参数。

int main()
{
    int nArgCount = __argc;
    char** pArgs= __argv;

    printf("Argument Count: %d\n", nArgCount-1);
    printf("Arguments:");

    for(int nIndex = 1; nIndex<nArgCount; ++nIndex)
        printf("%s, ", pArgs[nIndex]);
}

您还可以使用GetCommandLine函数访问命令行。不使用main的参数的重要方面是您仍然可以在任何函数中访问命令行参数


1
像其他人提到的那样,这只是方便的问题,Kernighan和Ritchie在第一个C版本中使用了这些参数,因此一直沿用至今。
您可以自由地使用任何东西。
以下是一个简单的例子:
#include <iostream>

int main(int arglen, char *args[])
{
        std::cout << "Running: " << *args << std::endl;
    while (--arglen > 0)
        std::cout << *++args << std::endl;
    return 0;
}

我使用Visual C++ 2010 Express。如果您也使用它,可以按Alt+F7打开项目属性,进入“配置属性”>“调试”,在命令参数中输入您的命令行参数。

就是这样。


OP似乎误解了arglen和args的用途。 - Mooing Duck

1

如果您想要读取命令行参数的值,您必须使用char *argv[]。否则,您可以放弃它。

如果您只想要一个整数来区分两件事情,那么您有一种方法可以做到这一点。只需为一件事情传递命令行参数,而对于另一件事情则不需要传递任何参数。现在您不需要char *argv[]了。现在,当您仅为一件事情传递命令行参数时,argc的值为2,即可执行文件的名称+命令行参数。

如果您不传递命令行参数,则其值仅为1,即可执行文件的名称。


你的解释不清楚。@Ajay更好地描述了你的想法。 - John_West

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