c++ - sirve - ¿Qué significa int argc, char*argv[]?
int main int argc char*argv]) (8)
Ambos
int main(int argc, char *argv[]);
int main();
Son definiciones legales del punto de entrada para un programa C o C ++. Stroustrup: Preguntas frecuentes sobre el estilo y la técnica de C ++ detalla algunas de las variaciones posibles o legales para su función principal.
En muchos IDE y compiladores de C ++, cuando genera la función principal para ti, se ve así:
int main(int argc, char *argv[])
Cuando codifico C ++ sin un IDE, solo con un compilador de línea de comandos, escribo:
int main()
Sin ningún parámetro. ¿Qué significa esto, y es vital para mi programa?
El primer parámetro es el número de argumentos proporcionados y el segundo parámetro es una lista de cadenas que representan esos argumentos.
La función main
puede tener dos parámetros, argc
y argv
. argc
es un parámetro entero ( int
), y es el número de argumentos pasados al programa.
El nombre del programa siempre es el primer argumento, por lo que habrá al menos un argumento para un programa y el valor mínimo de argc
será uno. Pero si un programa tiene dos argumentos, el valor de argc
será tres.
El parámetro argv
apunta a una matriz de cadenas y se denomina vector de argumento . Es una matriz de cadena unidimensional de argumentos de función.
Los parámetros a main
representan los parámetros de línea de comando proporcionados al programa cuando se inició. El parámetro argc
representa el número de argumentos de la línea de comando, y char *argv[]
es una matriz de cadenas (punteros de caracteres) que representan los argumentos individuales proporcionados en la línea de comando.
Supongamos que ejecutas tu programa (usando la sintaxis sh
):
myprog arg1 arg2 ''arg 3''
Si declaró su main como int main(int argc, char *argv[])
, entonces (en la mayoría de los entornos), su main()
se llamará como si:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
Sin embargo, si declara su main como int main()
, se llamará algo así como
exit(main());
y no se pasan los argumentos.
Dos cosas adicionales a tener en cuenta:
- Estas son las únicas dos firmas de mandato estándar para
main
. Si una plataforma en particular acepta argumentos adicionales o un tipo de retorno diferente, entonces esa es una extensión y no se debe confiar en un programa portátil. -
*argv[]
y**argv
son exactamente equivalentes, por lo que puede escribirint main(int argc, char *argv[])
comoint main(int argc, char **argv)
.
argc
es el número de argumentos que se pasan a su programa desde la línea de comandos y argv
es la matriz de argumentos.
Puedes recorrer los argumentos sabiendo el número de ellos como:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
argv
y argc
son la forma en que los argumentos de la línea de comando se pasan a main()
en C y C ++.
argc
será el número de cadenas señaladas por argv
. Esto será (en la práctica) 1 más el número de argumentos, ya que prácticamente todas las implementaciones incluirán el nombre del programa en la matriz.
Las variables se denominan argc
( cuenta de argumentos ) y argv
( vector de argumento ) por convención, pero se les puede dar cualquier identificador válido: int main(int num_args, char** arg_strings)
es igualmente válido.
También se pueden omitir por completo, dando como resultado int main()
, si no tiene la intención de procesar argumentos de línea de comando.
Prueba el siguiente programa:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
Si lo ejecuta con ./test a1 b2 c3
saldrá
Have 4 arguments:
./test
a1
b2
c3
int main();
Esta es una declaración simple. No puede tomar ningún argumento de línea de comando.
int main(int argc, char* argv[]);
Esta declaración se usa cuando su programa debe tomar argumentos de línea de comando. Cuando se ejecuta como tal:
myprogram arg1 arg2 arg3
argc
, o Argument Count, se establecerá en 4 (cuatro argumentos), y argv
, o Argument Vectors, se rellenarán con punteros a "myprogram", "arg1", "arg2", y "arg3". ¡La invocación del programa ( myprogram
) está incluida en los argumentos!
Alternativamente, podrías usar:
int main(int argc, char** argv);
Esto también es válido.
Hay otro parámetro que puedes agregar:
int main (int argc, char *argv[], char *envp[])
El parámetro envp
también contiene variables de entorno. Cada entrada sigue este formato:
VARIABLENAME=VariableValue
Me gusta esto:
SHELL=/bin/bash
La lista de variables de entorno está terminada en nulo.
IMPORTANTE: ¡NO use ningún valor argv
o envp
directamente en las llamadas a system()
! Este es un gran agujero de seguridad, ya que los usuarios malintencionados podrían establecer variables de entorno para los comandos de la línea de comandos y (potencialmente) causar un daño masivo. En general, simplemente no use system()
. Casi siempre hay una mejor solución implementada a través de bibliotecas C