如果我写:
int main(int argc, char** argv)
我得到正确的命令行输入。 如果我写的话会怎么样,
int main(int foo, double fooDouble, fooType FooVar)
这是依赖于操作系统还是依赖于编译器?
答案 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代码“圣诞节的十二天”就是这样做的。在这种情况下,没有理由可以传递原型允许的任何内容。