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

很多程序对一些参数和string数组使用标准名称。 main函数的原型如下所示: int main(int argc, char *argv[]); 。 但是如果我为这些variablesselect自定义名称,我会打破一些东西吗?

例如int main(int n_of_args, char *args[]);

在编译器的上下文中,一切都很好。 这些variables对于主函数是本地的,所以它们可以有任何名字。 而简单的代码build立和运行完美。 但是这些名字可能被预处理器使用。 那么重命名这些参数是否安全?

PS我个人觉得这些名字不好,因为他们看起来很相似,只有一个字母不同。 但是每个人都会因为某种原因而使用它们。

是的,只要你使用有效的variables名,这是安全的。 它们是局部variables,所以它们的范围并不超出mainfunction。

C标准第5.1.2.2.1节:

程序启动时调用的函数名为main 。 这个实现声明了这个函数没有原型。 它应该用int的返回types来定义,并且不带参数:

 int main(void) { /* ... */ } 

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

 int main(int argc, char *argv[]) { /* ... */ } 

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

也就是说,使用除argcargv以外的任何内容都可能会使其他读取代码的人感到困惑,这些人习惯于使用这些参数的传统名称。 因此,我们宁愿错误地认错。

当然,您可以随意重命名这些参数

  int main(int wrzlbrnft, char* _42[]) { } 

名字是用沙子写的。 它们对最终编译的代码没有任何影响。


唯一重要的是,声明和定义的参数types实际上是匹配的。

main()函数的签名本质上被声明为

  int main(int, char*[]); 

如果你需要在实际中使用它们,你需要命名它们。 如前所述,使用哪个名称实际上是不相关的。

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

在C ++ 11之前,名称argcargv实际上是由C ++标准强制的。 它指出:

所有的实现都应该允许main的以下两个定义:

 int main () 

 int main ( int argc , char * argv []) 

并继续讨论对argcargv的要求。

所以在技术上,任何使用不同名称的程序都不符合标准,编译器可以拒绝它。 当然,编译器实际上并没有这样做。 在comp.std.c ++或C ++ 03草案标准的 3.6.1节中看到这个线程 。

这几乎肯定只是一个疏忽,在C ++ 11中被改变了

所有的实现都应该允许

  • ()函数返回int
  • int ,指向char指针)返回int的函数

作为main的types(8.3.5)。 在后一种forms中,为了说明的目的,第一个函数参数被称为argc ,第二个函数参数被称为argv ,…

是的,使用不同的名字是安全的。

就个人而言,我不会推荐它,因为传统的argcargv对于其他所有可能使用你的代码的C程序员来说都是广为人知和熟悉的。 从长远来看,使用自己的,特殊的,不同的名字将会给读者带来更多的困惑和/或挫折,因为你会更好地喜欢你的名字。

“在罗马做到入乡随俗。”

是的,你可以重新命名,只要你想。 它们只是函数参数名称,仅此而已。