2011-03-04 42 views
8

Duplicar posibles:
What is the proper declaration of main?C++ - int main (int argc, char ** argv)

¿Qué entendemos por los argumentos en esta función main? ¿Qué están tratando de decirnos?

int main(int argc, char** argv)

ACTUALIZACIÓN: Y, es la línea anterior de código similar a este int main(int argc, char* argv[])? Si es así, ¿cómo podemos decir que char** argv es similar a char* argv[] ya que no se ven similares desde un punto de vista matriz?

¿Cómo se compara con int main() que no tiene ningún argumento?

Gracias.

Respuesta

9

El parámetro argc es el número de opciones de línea de comando especificadas, incluido el nombre del ejecutable, cuando se invocó el ejecutable. Las opciones de línea de comando individuales se encuentran en la matriz argv, que es NULL terminada (el nombre y la ruta utilizados para invocar el ejecutable está en argv[0]).

La diferencia entre las dos versiones es simplemente si desea analizar argumentos de línea de comando o no; si no está interesado en ellos, puede ignorarlos utilizando el segundo formulario.

4

Wikipedia ofrece una buena explicación. El primer parámetro le da la cantidad de argumentos de línea de comando, y el segundo le da los argumentos reales.

2

argc te da la cantidad de argumentos y argv te da esos argumentos. La primera de ellas es la ruta de acceso al .exe se utiliza para ejecutar su programa, los siguientes son los argumentos de la persona que llama a su .exe proporcionado en la línea de comando como este:

my.exe arg1 arg2 

Mientras

int main() {} 

simplemente ignora los argumentos.

2

argv es una matriz que contiene los parámetros de la línea de comandos pasados ​​a la aplicación. argc te dice la cantidad de elementos contenidos en esa matriz.

3

Representan los parámetros de la línea de comando.

argc es el número de parámetros de la línea de comandos, incluido el nombre del ejecutable. argv es una matriz de cadenas terminadas en nulo, donde argv[0] es el parámetro de la línea de comando y argv[i] es el parámetro ith después de eso, argv[argc-1] es el último y argv[argc] está realmente bien definido y tiene un puntero NULL.

Por lo tanto:

foo bar baz

en la línea de comandos tendrá argc = 3, argv[0] = "foo" argv[1] = "bar" argv[2] = "Baz" argv[3] = NULL

Nota que hay no hay ningún archivo adjunto especial para los argumentos de "bandera".

grep -i foo bar.cpp bar.h

tendría 4 argumentos (argc = 5 incluyendo grep sí mismo), -i es uno de ellos y esto se aplicaría incluso si el siguiente parámetro era un "valor" unido a la bandera.

Nota si se hizo un comodín

grep -i foo *

en UNIX, al menos, el * se ampliaría antes de la llamada a grep y así cada archivo que coincidió sería un argumento.

Por cierto

char** argv y char* argv[]

hacen lo mismo.

Además, aunque la norma dice que debe usar una de estas firmas (ni siquiera debe agregar ninguna constelación) no hay ninguna ley que tenga que usar esos dos nombres variables, pero es tan convencional ahora que son bonitas mucho universal. (es decir, puede usar argCount y argValues si lo desea).

+1

Creo que te refieres a 'argc = 3' not' argc = 2'. – trojanfoe

+0

sí, corregido – CashCow

+0

De nada. – trojanfoe