【问题标题】:Arguments for main() in C++C++ 中 main() 的参数
【发布时间】:2019-11-18 00:10:55
【问题描述】:

我一直在关注来自 Levine 的 Flex & Bison 一书,我看到了以下代码:

main(argc, argv)
int argc;
char **argv;
{
    if(argc > 1) {
        if(!(yyin = fopen(argv[1], "r"))) {
            perror(argv[1]);
            return (1);
        }
    }
    yylex();

这部分我觉得有点难理解,比如第一行:

char **argv;

据我所知,它应该与这部分有关:

if(!(yyin = fopen(argv[1], "r")))

所以我可以解释它正在读取输入操作,这是因为“r”,而 argv[1] 指的是控制台输入的一行。是这样吗?我不知道为什么作者使用指向 argv 的双指针。我想当没有有效输入时,它会使用 perror() 打印一个描述性错误,但在这种情况下会发生这种情况吗?

任何解释此代码的帮助都非常有价值。

谢谢

【问题讨论】:

  • 您的书显然是一本仍然使用原始 C 语言版本 K&R C 的旧书。当前的、现代的 C/C++ 将 main 声明为 int main(int argc, char *argv[]),因此您可能想四处寻找一本更新的书,以补充这本书。
  • 您的问题与bisonflex-lexer 完全无关。这只是关于main()

标签: c++ main


【解决方案1】:

C++ 编译器将char **argv 解释为与char* argv[] 相同,即指向指针数组的指针。您可能已经知道,argv 表示传递给程序可执行文件的参数,例如./program arg1 arg2。您可以将argv 视为一个字符串数组(C 字符串),如果这样可以简化事情,那么数组的每个元素都是一个参数。

您的解释基本上是正确的。它检查至少有一个参数argc > 0(参数计数),然后使用第一个参数(argv[1] as argv[0] 实际上是指程序名./program)作为文件名。然后它会尝试打开一个名为 argv[1] 的文件进行读取。如果失败,fopen返回NULL。如果文件不存在,就会发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-20
    • 2011-05-09
    • 2021-10-24
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2013-12-26
    相关资源
    最近更新 更多