在主函数中重命名argc和argv是否安全?
很多程序对一些参数和string数组使用标准名称。 main函数的原型如下所示: int main(int argc, char *argv[]);
。 但是如果我为这些variablesselect自定义名称,我会打破一些东西吗?
例如int main(int n_of_args, char *args[]);
在编译器的上下文中,一切都很好。 这些variables对于主函数是本地的,所以它们可以有任何名字。 而简单的代码build立和运行完美。 但是这些名字可能被预处理器使用。 那么重命名这些参数是否安全?
PS我个人觉得这些名字不好,因为他们看起来很相似,只有一个字母不同。 但是每个人都会因为某种原因而使用它们。
是的,只要你使用有效的variables名,这是安全的。 它们是局部variables,所以它们的范围并不超出main
function。
C标准第5.1.2.2.1节:
程序启动时调用的函数名为
main
。 这个实现声明了这个函数没有原型。 它应该用int
的返回types来定义,并且不带参数:int main(void) { /* ... */ }
或者带有两个参数(这里称为
argc
和argv
, 尽pipe可以使用任何名称,因为它们是声明它们的函数的本地 ):int main(int argc, char *argv[]) { /* ... */ }
或同等学历; 或者以某种其他实现定义的方式
也就是说,使用除argc
和argv
以外的任何内容都可能会使其他读取代码的人感到困惑,这些人习惯于使用这些参数的传统名称。 因此,我们宁愿错误地认错。
当然,您可以随意重命名这些参数
int main(int wrzlbrnft, char* _42[]) { }
名字是用沙子写的。 它们对最终编译的代码没有任何影响。
唯一重要的是,声明和定义的参数types实际上是匹配的。
main()
函数的签名本质上被声明为
int main(int, char*[]);
如果你需要在实际中使用它们,你需要命名它们。 如前所述,使用哪个名称实际上是不相关的。
是。 这是安全的,它看起来很奇怪,但不会破坏任何东西。
在C ++ 11之前,名称argc
和argv
实际上是由C ++标准强制的。 它指出:
所有的实现都应该允许main的以下两个定义:
int main ()
和
int main ( int argc , char * argv [])
并继续讨论对argc
和argv
的要求。
所以在技术上,任何使用不同名称的程序都不符合标准,编译器可以拒绝它。 当然,编译器实际上并没有这样做。 在comp.std.c ++或C ++ 03草案标准的 3.6.1节中看到这个线程 。
这几乎肯定只是一个疏忽,在C ++ 11中被改变了
所有的实现都应该允许
- ()函数返回
int
和- (
int
,指向char
指针)返回int
的函数作为
main
的types(8.3.5)。 在后一种forms中,为了说明的目的,第一个函数参数被称为argc
,第二个函数参数被称为argv
,…
是的,使用不同的名字是安全的。
就个人而言,我不会推荐它,因为传统的argc
和argv
对于其他所有可能使用你的代码的C程序员来说都是广为人知和熟悉的。 从长远来看,使用自己的,特殊的,不同的名字将会给读者带来更多的困惑和/或挫折,因为你会更好地喜欢你的名字。
“在罗马做到入乡随俗。”
是的,你可以重新命名,只要你想。 它们只是函数参数名称,仅此而已。