我通常将主函数的形式参数声明为
int argc, char* argv[]
或 int argc, char** argv
以从命令行获取实际参数。但我注意到一位最资深的 C 程序员,他也恰好是 ISO 委员会的成员和 C23 修订版的共同作者,使用 int argc, char* argv[argc+1]
或 int argc, char* argv[argc]
。这样做有什么意义?
C11 ISO/IEC 9899:2011 第 6.7.6.2 款第 1 段表示
和[
可以界定表达式或]
。如果他们划定一个 表达式(指定数组的大小),表达式 应具有整数类型。如果表达式是一个常数 表达式,它的值应大于零。*
这种作为函数参数的数组声明为编译器提供了有关参数之间关系的信息,具体来说,哪个参数指定了可以对传递的数组进行索引的有效长度。
这可用于静态分析,或在调试版本中自动生成参数验证代码,或者在鲁棒性和防御性执行很重要的情况下使用。