Gee*_*kyJ 14 c program-entry-point command-line-arguments
情况1:
void hello(void) {
//something
}
int main()
{
hello(1); //error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
案例2:
int main(void) {
//something
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行:
./a.out something something //No error, Why?
Run Code Online (Sandbox Code Playgroud)
为什么没有错误?main将无法采取任何论点.那么为什么可以从命令行提供参数呢?
gna*_*729 14
因为C编译器和命令行解释器(或用于调用程序的任何东西)是不同的东西.
C语言允许以各种方式声明main().
命令行解释器将使程序可以使用任何参数.如果程序忽略它们,那就不是它的业务.
命令行解释器甚至不知道您使用C编译程序.在我的计算机上,程序可以用C,C++,Objective-C,Objective-C++,Swift,Fortran,Ada等编写.这些编译器中的每一个都可能会或可能不会从命令行接受命令.
不检查规范或编译结果,它不会导致错误,因为C运行时将获取参数并将它们传递给main(),但是这种类型main()将忽略传递的参数,并且如果调用者有责任清理内存(堆栈)用作参数,它将不会产生任何问题,就像获取一些参数而不在代码中使用它们一样.
此代码不会在C中发出错误:
void hello(); // in C, the compiler won't check arguments
int main() {
hello(1); //no error
return 0;
}
void hello(void) {
//something
}
Run Code Online (Sandbox Code Playgroud)
因为./a.out something something不是直接调用你的主要功能.主要功能由c运行时库调用.命令行参数由loader/c运行时放置在堆栈中的某个区域(最开始).如果您想要访问这些参数,则由您决定.
另外,正如其中一条评论所指出的那样,至少有一个命令行参数总是被传递(程序的名称./a.out要精确) - 所以你必须在这种情况下想知道错误.