当你不遵循argv和argc的做法时会发生什么

时间:2011-06-30 12:07:12

标签: c++ c command-line command-line-arguments

  

可能重复:
  main(int argc, char *argv[])
  Main's Signature in C++

如果我写:

int main(int argc, char** argv)

我得到正确的命令行输入。 如果我写的话会怎么样,

int main(int foo, double fooDouble, fooType FooVar)

这是依赖于操作系统还是依赖于编译器?

4 个答案:

答案 0 :(得分:6)

鉴于它确实编译,它仍然只能使用argc和argv参数调用。

因此你的fooDouble将获得argv的指针值,并且FooVar将获得用于该参数位置的寄存器/堆栈空间中的任何值(可能未被被调用者初始化,因此它可能包含任何未定义的值)。

答案 1 :(得分:5)

这段代码甚至不需要编译。如果是,则可能发生未定义的行为。

答案 2 :(得分:5)

main添加第三个(或第四个或第五个......)参数的效果确实取决于操作系统。例如,在Windows上(我也相信Unix),您可以使用第三个参数来授予对环境变量的访问权限:

int main( int argc, char **argv, char **env )

答案 3 :(得分:2)

C标准(BS ISO / IEC 9899:1999)为main提供了两种选择:

int main(void) { /* ... */ }

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

它也允许等价物,例如char ** argv的argv。其他论点“既没有受到标准的祝福也没有被禁止”。这些添加将是编译器和运行时(非操作系统)特定的。

参数由C运行时传递,它调用main()。传递任何其他类型在Windows和UNIX等一般环境中都会出现问题,因此您希望传递double或fooType的方式超出我的范围。

从命令行或使用execve(UNIX)或CreateProcess(Win32)等接口调用程序涉及传递零分隔字符串。从理论上讲,你可以破解它传递一个二进制值,然后将其强制转换为main,前提是它除了最后都不包含'\ 0',这将是一个挑战。

编辑:我发现你可以从程序中调用main() - 众所周知的混淆C代码“圣诞节的十二天”就是这样做的。在这种情况下,没有理由可以传递原型允许的任何内容。