2012-10-12 162 views
5

Si deseo mantener la mayor parte de mi código para procesar argumentos de línea de comando fuera de main (para organización y código más legible), ¿cuál sería la mejor manera de hacerlo?Procesar argc y argv fuera de main()

void main(int argc, char* argv[]){ 
    //lots of code here I would like to move elsewhere 
} 

Respuesta

4

Cualquiera de las pasan como parámetros, o almacenarlos en variables globales. Siempre que no regrese desde main e intente procesarlos en un controlador atexit o el destructor de un objeto en ámbito global, aún existen y podrá acceder desde cualquier ámbito.

Por ejemplo:

// Passing them as args: 
void process_command_line(int argc, char **argv) 
{ 
    // Use argc and argv 
    ... 
} 

int main(int argc, char **argv) 
{ 
    process_command_line(argc, argv); 
    ... 
} 

alternativa:

// Global variables 
int g_argc; 
char **g_argv; 

void process_command_line() 
{ 
    // Use g_argc and g_argv 
    ... 
} 

int main(int argc, char **argv) 
{ 
    g_argc = argc; 
    g_argv = argv; 
    process_command_line(); 
    ... 
} 

ellos pasar como parámetros es un diseño mejor, ya que está encapsulado y te permite modificar los parámetros/sustitutos si desea o convertir su programa fácilmente en una biblioteca. Las variables globales son más sencillas, ya que si tiene muchas funciones diferentes que acceden a los argumentos por cualquier motivo, puede almacenarlas una sola vez y no es necesario que las siga pasando entre todas las funciones diferentes.

2

simplemente pasan argc y argv como argumentos de la función en la que desea procesarlos.

void parse_arg(int argc, char *argv[]);

3

Uno debe cumplir con los estándares siempre que sea práctico. Por lo tanto, no escriba

void main 

que nunca ha sido válida C o C++, pero en lugar de escribir

int main 

Con eso, su código puede compilar con, por ejemplo, g ++ (con las opciones habituales del compilador).

Dado el void main sospecho que un entorno de Windows. Y de todos modos, para admitir el uso de su programa en un entorno de Windows, no debe usar los argumentos main en Windows. Funcionan en * nix porque fueron diseñados en y para ese entorno; en general, no funcionan en Windows, porque por defecto (según una convención muy fuerte) están codificados como ANSI de Windows, lo que significa que no pueden codificar nombres de archivo con caracteres fuera de la configuración regional actual del usuario.

Por lo tanto, para Windows es mejor usar la función de API GetCommandLine y su función de análisis hermana. Para la portabilidad esto debería estar mejor encapsulado en algún módulo de argumentos de línea de comando. Luego debe tratar el interesante problema de usar wchar_t en Windows y char en * nix & hellip;

De todos modos, no estoy seguro de la API * nix correspondiente, o incluso si hay una, pero google it. En el peor de los casos, para * nix siempre puede inicializar un módulo de argumentos de línea de comando desde main. La fealdad de * nix proviene directamente de la necesidad de soportar la portabilidad con la construcción más no portátil, específica para OS, de C++, a saber, el estándar main.

+0

Estoy completamente de acuerdo con 'int main' sobre' void main'. Sin embargo, el otro comentario me deja ... perplejo. ¿Qué sistema que no sea Windows tiene un problema con la convención estándar de C++ para 'main()'? No conozco ninguno, por lo que optar por la convención estándar como 'no portátil' y 'OS-specific' parece OTT. –

+0

@JonathanLeffler: No conozco ningún otro sistema de uso común que no sea Windows, donde los argumentos 'main' no funcionan (salvo para el texto ASCII puro del alfabeto inglés). Aún así, una característica que no funciona en Windows ** es ** no portátil, y una característica diseñada para Unix-land ** es ** específica del sistema operativo. Y la convención de argumentos 'main' no funciona en Windows (es decir, no es portátil) y está diseñada para Unix-land (es decir, es específica de sistema operativo), y esos dos aspectos están fuertemente conectados. No hay absolutamente nada divertido al respecto. Solo puedo pensar en feos motivos políticos por su persistencia. –

0

Echa un vistazo a la familia de funciones y bibliotecas "getoptlong". Estos ofrecen una forma estructurada de definir los argumentos que su programa espera y luego puede analizarlos fácilmente por usted.También puede ayudar con la generación de respuestas de documentación/ayuda.

Es una biblioteca antigua en el mundo de UNIX, y también hay una implementación .Net en C#. (+ Perl, Ruby, & Probablemente más. ¡Es bueno tener un solo paradigma utilizable en todos estos! Aprende una vez, ¡úsalo en todas partes!)

Cuestiones relacionadas