在许多C++ IDE和编译器中,当它为您生成主函数时,它看起来像这样:
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)
当我在没有IDE的情况下编写C++代码时,只需使用命令行编译器,我输入:
int main()
Run Code Online (Sandbox Code Playgroud)
没有任何参数.这意味着什么,对我的计划至关重要?
int main( const int argc , const char[] const argv)
Run Code Online (Sandbox Code Playgroud)
正如有效的C++第3项规定"尽可能使用const",我开始思考"为什么不制作这些'常数'参数const"?
是否存在argc在程序中修改值的任何情况?
每个程序都从main(int argc, char *argv[])定义开始.
我不明白这意味着什么.如果我们在程序中不使用这些参数,有人可以解释为什么我们会使用这些参数,我会很高兴的吗?为什么不int main()呢:?
程序的名称是其中的一个元素,*argv[]并且argc是参数个数的计数*argv[]?发送到的其他参数是*argv[]什么?我们如何发送它们?
这就是我们如何使用MPI_Init函数
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
Run Code Online (Sandbox Code Playgroud)
为什么MPI_Init使用指向argc和argv的指针而不是argv的值?
我最近看到一些好奇的东西.在HHVM源代码中,该main()函数的前3行内容如下:
if (!argc) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这有点傻,但是,我还是忍不住想知道...... 为什么要回归0!并不是我认为有一些正确的方法可以解决这个问题,但通常与成功相关的0返回似乎特别不合适.
除了没有崩溃,有没有一个适当的响应argc0?(甚至还不到0?)这有关系吗?
我知道最终在argc0 的情况下结束的唯一方法是exec()和朋友一起.如果出于某种原因确实发生了这种情况,那几乎可以肯定是调用者中的一个错误,而被调用者无法做很多事情.
(标记为C和C++,因为我希望这两种语言的答案是相同的)
编辑:为了使问题不那么模糊和哲学,我会提供另一种选择.
if (!argc) {
puts("Error: argc == 0");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
关键点是有错误的指示并返回非零值.这种情况极不可能需要,但如果是这样,你可能会尝试指出错误.另一方面,如果检测到的错误严重到argc等于0,那么尝试访问stdout或C标准库可能是不好的.
是否可以执行argc = 0的进程?我需要执行一个程序,但它的argc等于0是非常重要的.有没有办法做到这一点?我试图在命令行中放置2 ^ 32个参数,使其看起来好像argc = 0但是参数个数有一个最大限制.
我一直认为这argc是标志结束的必要条件,argv但我只是argv[argc] == NULL按照定义学到了这一点.我认为这argc完全是多余的吗?如果是这样,我一直认为C以效率的名义取消冗余.我的假设是错误的还是背后的历史原因?如果原因是历史性的,你能详细说明吗?
如果我想保留用于处理命令行参数的大部分代码(用于组织和更易读的代码),那么最好的方法是什么?
void main(int argc, char* argv[]){
//lots of code here I would like to move elsewhere
}
Run Code Online (Sandbox Code Playgroud) 我正在使用共享主机(fasthostingdirect),由于某种原因,他们默认关闭此标志.这意味着我无法访问PHP命令行参数...除非我之后使用-n(= --no-php-info)标志php.exe.
尝试ini_set('register_argc_argv', 1)过我的php文件,但没有效果.我猜这是由于托管服务提供商的限制性质,但他们并没有停止-n选择 - 不知道使用它的其他含义.有没有人有更好的建议?
argc有时返回正确的值,有时返回 0,有时返回(看似)随机数……所有这些都来自同一个可执行文件。
.section .text
.global _start
_start:
movq $1, %rax
popq %rdi
syscall
Run Code Online (Sandbox Code Playgroud)
例如:
%as -o this.o this.s ; ld -o this this.o
%./this; echo $?
1
%./this 1; echo $?
0
%./this 1 2; echo $?
3
%./this 1 2 a; echo $?
4
%./this 1 2 a f; echo $?
0
%_
Run Code Online (Sandbox Code Playgroud)
我对汇编有点陌生,但我非常有信心获取参数计数就像在 Linux 中将其从堆栈中弹出一样简单,其中 System V ABI 记录 RSP 在argc新execve进程中指向的内容。
是我做错了什么,还是事情真的很糟糕?