c++ - por - para que sirve int argc char*argv[]
¿Por qué necesitamos argc mientras que siempre hay un nulo al final de argv? (4)
Parece que el argv[argc]
siempre es NULL
, por lo que creo que podemos atravesar la lista de argumentos sin argc
. Un único ciclo while hará esto.
Si siempre hay un NULL
al final de argv
, ¿por qué necesitamos un argc
?
Es por razones históricas y compatibilidad con el código anterior. Originalmente, no había una garantía de que existiría un puntero nulo como último elemento de la matriz argv. Pero argc siempre ha existido.
Lo "necesitamos" porque es requerido por varios estándares.
Podemos ignorar el valor por completo, pero como es el primer parámetro de main
, debemos tenerlo en la lista de parámetros. En C ++ (y probablemente dialectos C no estándar), puede omitir el nombre del parámetro, como este fragmento de C ++ (fácil de convertir a C):
#include <stdio.h> // C-compatible include, guarantees puts in global namespace
// program will print contents of argv, one item per line, starting from argv[0]
int main(int /*argc*/, char *argv[]) { // uncomment argc for C
//(void)argc; // uncomment statement for C
for (int i=0; argv[i]; ++i) {
puts(argv[i]);
}
return 0;
}
En la norma C, con configuraciones de advertencias comunes, el parámetro no utilizado genera una advertencia, que se puede corregir mediante una declaración como (void)argc;
que hace que el nombre sea utilizado sin generar ningún código.
argc
es bueno tenerlo, porque de lo contrario muchos programas tendrían que caminar a través de los parámetros para obtener el conteo. Además, en muchos lenguajes de programación con matrices que tienen longitud, no hay ningún parámetro argc
, solo hay una matriz con los elementos.
Sí, argv[argc]
garantiza que es un puntero nulo. argc
se usa por conveniencia.
Citando la explicación oficial de C99 Justificación, tenga en cuenta las palabras verificación redundante :
Justificación del estándar internacional - Lenguajes de programación - C §5.1.2.2.1 Inicio del programa
La especificación de
argc
yargv
como argumentosmain
reconoce una extensa práctica previa.argv[argc]
debe ser un puntero nulo para proporcionar una verificación redundante para el final de la lista, también sobre la base de la práctica común.
Sí, argv[argc]==NULL
está garantizado. Ver C11 5.1.2.2.1 Inicio del programa (mi énfasis)
Si se declaran, los parámetros de la función principal obedecerán las siguientes restricciones:
El valor de argc debe ser no negativo. argv [argc] será un puntero nulo.
Por lo tanto, proporcionar argc
no es vital, pero sigue siendo útil. Entre otras cosas, permite una comprobación rápida de que se ha pasado la cantidad correcta de argumentos.
Editar: la pregunta ha sido modificada para incluir C ++. n3337 borrador 3.6.1 Función principal dice
2 ... argc será el número de argumentos pasados al programa desde el entorno en el que se ejecuta el programa. .... El valor de argc debe ser no negativo. El valor de argv [argc] será 0 .