yan*_*pas 82 c c++ program-entry-point
许多程序对许多参数和字符串数组使用标准名称.主要功能的原型如下:int main(int argc, char *argv[]);.但如果我为这些变量选择自定义名称,我会破坏一些东西吗?
例如 int main(int n_of_args, char *args[]);
在编译器的上下文中,一切都很好.这些变量对于main函数是本地的,因此它们可以具有任何名称.简单的代码构建和运行完美.但这些名称可能由预处理器使用.那么重命名这些论点是否安全?
PS我个人觉得这些名字很糟糕,因为它们看起来很相似,只有一个字母不同.但是每个人都出于某种原因使用它们.
dbu*_*ush 119
是的,只要您使用有效的变量名称,它就是安全的.它们是局部变量,因此它们的范围不会超出main函数范围.
从C标准的 5.1.2.2.1节:
在程序启动时调用的函数被命名
main.该实现声明此函数没有原型.它应定义为返回类型int且没有参数:Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为
argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或同等学历; 或者以某种其他实现定义的方式
话虽这么说,使用除了以外的任何东西argc并且argv可能会混淆其他读取代码的人,这些代码习惯于这些参数的常规名称.因此,在犯罪方面更好地犯错.
Nic*_*teo 38
的名称argc和argv实际上由C++授权C++标准之前11.它说:
所有实现都应允许以下两个主要定义:
Run Code Online (Sandbox Code Playgroud)int main ()和
Run Code Online (Sandbox Code Playgroud)int main ( int argc , char * argv [])
并继续讨论关于要求argc和argv.
因此从技术上讲,任何使用不同名称的程序都不符合标准,并允许编译器拒绝它.当然,没有编译器实际上这样做了.请参阅comp.std.c ++上的此主题,或本C++ 03草案标准的第3.6.1节.
这几乎肯定只是一种疏忽,并且在C++ 11中有所改变,而C++ 11则更改了
所有实现都应允许两者
- ()返回
int和的函数- 返回的(
int,指向指针的指针char)的函数int作为
main(8.3.5)的类型.在后一种形式中,出于说明的目的,调用第一个函数参数并调用argc第二个函数参数argv,...
πάν*_*ῥεῖ 28
当然,你可以重命名这些参数,安全,只要你喜欢
int main(int wrzlbrnft, char* _42[]) {
}
Run Code Online (Sandbox Code Playgroud)
名字用沙子写成.它们对最终编译的代码没有任何影响.
唯一重要的是,声明和定义的参数类型实际匹配.
该main()函数的签名本质上声明为
int main(int, char*[]);
Run Code Online (Sandbox Code Playgroud)
如果你需要在实现中使用它们实际上你需要命名它们.如前所述,使用哪些名称实际上是无关紧要的.
是的,使用不同的名称是安全的.
就个人而言,我不会推荐它,因为它是传统的,argc并且argv对于可能使用您的代码的每个其他C程序员来说都是如此广为人知和熟悉.从长远来看,使用您自己的,特殊的,不同的名称将导致您的读者更加困惑和/或挫折,因为您更喜欢自己的名字.
"在罗马做到入乡随俗."