在main函数中重命名argc和argv是否安全?

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且没有参数:

int main(void) { /*  ... */ }
Run Code Online (Sandbox Code Playgroud)

或者有两个参数(这里称为argcargv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):

int main(int argc, char *argv[]) { /* ...   */ }
Run Code Online (Sandbox Code Playgroud)

或同等学历; 或者以某种其他实现定义的方式

话虽这么说,使用除了以外的任何东西argc并且argv可能会混淆其他读取代码的人,这些代码习惯于这些参数的常规名称.因此,在犯罪方面更好地犯错.


Nic*_*teo 38

的名称argcargv实际上由C++授权C++标准之前11.它说:

所有实现都应允许以下两个主要定义:

int main ()
Run Code Online (Sandbox Code Playgroud)

int main ( int argc , char * argv [])
Run Code Online (Sandbox Code Playgroud)

并继续讨论关于要求argcargv.

因此从技术上讲,任何使用不同名称的程序都不符合标准,并允许编译器拒绝它.当然,没有编译器实际上这样做了.请参阅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)

如果你需要在实现中使用它们实际上你需要命名它们.如前所述,使用哪些名称实际上是无关紧要的.

  • 只有一些标识符在你写的时候"写在沙子里".功能名称当然不是. (5认同)
  • @πάνταῥεῖ:除非你特别努力删除它们,否则函数名称会保留在最终的可执行文件中. (4认同)
  • 好吧但很认真.编译后,目标代码中仍然包含函数名.否则链接不起作用 (3认同)

cor*_*ump 15

是.这是安全的,看起来很奇怪,但它不会破坏任何东西.


Ste*_*mit 7

是的,使用不同的名称是安全的.

就个人而言,我不会推荐它,因为它是传统的,argc并且argv对于可能使用您的代码的每个其他C程序员来说都是如此广为人知和熟悉.从长远来看,使用您自己的,特殊的,不同的名称将导致您的读者更加困惑和/或挫折,因为您更喜欢自己的名字.

"在罗马做到入乡随俗."


orb*_*boy 5

是的,您可以根据需要重命名它们.它们只是函数参数名称,仅此而已.