En muchos IDE y compiladores de C ++, cuando genera la función principal para usted, 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?
c++
parameters
command-line-arguments
argv
argc
Greg Treleaven
fuente
fuente
int main(int argc, char* argv[], char* envp[])
e imprimir el último argumento.;)
system()
llamadas, consultas de base de datos, etc. Como es habitual con la entrada del usuario.char **envp
argumento?Respuestas:
argv
yargc
cómo se pasan los argumentos de la línea de comandosmain()
en C y C ++.argc
será el número de cadenas señaladas porargv
. Esto (en la práctica) será 1 más el número de argumentos, ya que prácticamente todas las implementaciones antepondrán el nombre del programa a la matriz.Las variables se denominan
argc
( recuento de argumentos ) yargv
( vector de argumentos ) 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, produciendo
int main()
, si no tiene la intención de procesar argumentos de línea de comandos.Prueba el siguiente programa:
Ejecutarlo con
./test a1 b2 c3
generaráfuente
argc
puede ser 0, en cuyo casoargv
puede ser NULL. Está permitido por el estándar AFAIK. Nunca he oído hablar de un sistema que haga esto en la práctica, pero ciertamente podría existir y no violaría ningún estándar.argv[argc]
será 0" (C ++ 03 §3.6.1 / 2),argv
no puede ser nulo.*NULL
definitivamente no es igual aNULL
.argc
es la cantidad de argumentos que se pasan a su programa desde la línea de comandos yargv
es la matriz de argumentos.Puede recorrer los argumentos sabiendo el número de ellos como:
fuente
Supongamos que ejecuta su programa de esta manera (usando la
sh
sintaxis):Si declaró su main como
int main(int argc, char *argv[])
, entonces (en la mayoría de los entornos),main()
se le llamará como si así:Sin embargo, si declaró su principal como
int main()
, se llamará algo así comoy no se pasan los argumentos.
Dos cosas adicionales a tener en cuenta:
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 puedes escribirint main(int argc, char *argv[])
comoint main(int argc, char **argv)
.fuente
basic.start.main/2
permite explícitamente versiones adicionales definidas por la implementación demain()
, siempre que la implementación proporcione las dos versiones predefinidas. Entonces, no son exactamente no conformes. El más común esenvp
, que es tan bien conocido tanto en C y C ++ que es literalmente la primera entrada en la sección J.5 (Extensiones comunes) de la norma C .Los parámetros para
main
representar los parámetros de línea de comando proporcionados al programa cuando se inició. Elargc
parámetro representa el número de argumentos de la línea de comandos ychar *argv[]
es una matriz de cadenas (punteros de caracteres) que representan los argumentos individuales proporcionados en la línea de comandos.fuente
argv[0]
es lo que el programa que lanzó el programa C le dioargv[0]
. En el caso de Bash, a menudo es (tal vez siempre) la ruta del ejecutable, pero Bash no es el único programa que ejecuta otros programas. Es permissisble, aunque excéntrico, a utilizar:char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. En muchos sistemas, el valor visto por el programa comoargv[0]
serácat
, aunque el ejecutable sea/bin/ls
.La
main
función puede tener dos parámetros,argc
yargv
.argc
es unint
parámetro entero ( ), y es el número de argumentos pasados al programa.El nombre del programa es siempre 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 deargc
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.fuente
Esta es una simple declaración. No puede tomar ningún argumento de línea de comando.
Esta declaración se usa cuando su programa debe tomar argumentos de línea de comandos. Cuando se ejecuta así:
argc
, o Argument Count, se establecerá en 4 (cuatro argumentos), yargv
, o Argument Vectors, se completará con punteros de cadena a "myprogram", "arg1", "arg2" y "arg3". ¡La invocación del programa (myprogram
) está incluida en los argumentos!Alternativamente, podría usar:
Esto también es válido.
Hay otro parámetro que puede agregar:
El
envp
parámetro también contiene variables de entorno. Cada entrada sigue este formato:Me gusta esto:
La lista de variables de entorno está terminada en nulo.
IMPORTANTE: ¡NO use ninguno
argv
oenvp
valores directamente en las llamadas asystem()
! Este es un gran agujero de seguridad, ya que los usuarios malintencionados pueden configurar variables de entorno para los comandos de la línea de comandos y (potencialmente) causar daños masivos. En general, simplemente no lo usesystem()
. Casi siempre hay una mejor solución implementada a través de las bibliotecas C.fuente
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.
fuente
Ambos
son definiciones legales del punto de entrada para un programa C o C ++. Las preguntas frecuentes de Stroustrup: Estilo y técnica de C ++ detallan algunas de las variaciones que son posibles o legales para su función principal.
fuente
int main()
==>int main(void)
... para compatibilidad y legibilidad. No sé si todas las versiones anteriores de C permiten que las funciones nulas tengan una lista de parámetros vacía en la declaración.void
es obligatorio. No me cites sobre eso, y ahora sé que es un comentario un poco tonto. Sin embargo, no puede doler.