argumentos de línea de comandos de acceso sin necesidad de utilizar char ** argv en main

StackOverflow https://stackoverflow.com/questions/2471553

  •  20-09-2019
  •  | 
  •  

Pregunta

¿Hay alguna manera de acceder a los argumentos de línea de comandos, sin necesidad de utilizar el argumento principal a? Necesito acceder a él en otra función, y yo preferiría no pasar en.

Necesito una solución que sólo funciona necesariamente en Mac OS y Linux con GCC.

¿Fue útil?

Solución

No creo que debería hacerlo como el tiempo de ejecución C preparará los argumentos y pasarlo a la principal vía int argc, char **argv, no intente manipular el comportamiento por el pirateo de arriba, ya que sería en gran medida el comportamiento no portables o posiblemente no definido! ! Se adhieren a las reglas y usted tendrá la portabilidad ... no hay otra manera de hacerlo que no sea romperlo ...

Otros consejos

No sé cómo hacerlo en MacOS, pero sospecho que el truco voy a describir aquí puede ser portado a Mac OS con un poco de lectura cruzada.

En Linux se puede utilizar la sección denominada ".init_array" del binario ELF, para registrar una función que es llamada durante initilization programa (antes de main () se llama). Esta función tiene la misma firma que la principal función normal (), que devuelve execept "vacío". Por lo tanto, puede utilizar esta función para recordar o argc proceso, argv [] y EVP [].

Aquí hay un código que puede utilizar:

static void my_cool_main(int argc, char* argv[], char* envp[])
{
    // your code goes here
}

__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main;

PS: Este código también se puede poner en una biblioteca, por lo que debe adaptarse a su caso. Incluso funciona, cuando su prgram se ejecuta con valgrind -. Valgrind no se bifurca un nuevo proceso, y esto se traduce en / proc / self / cmdline que muestra la valgrind de línea de comandos originales

PPS: Tenga en cuenta que durante esta ejecución del programa muy temprano muchos subsistema no están todavía totalmente inicializado - Probé libc de E / S de rutinas, que parecen funcionar, pero no confiar en ella - incluso las variables Gloval todavía no podrían construirse, etc ...

Puede copiarlos en variables globales si lo desea.

En Linux, puede abrir /proc/self/cmdline (suponiendo que /proc está presente) y extrae manualmente (esto sólo es necesario si necesita argc / argv antes main() - por ejemplo, en un constructor mundial - como por lo demás es mejor para pasarlos a través de VARs globales).

Más soluciones están disponibles aquí: http://blog.linuxgamepublishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

Sí, es bruta y no portables, pero si se te plantea problemas prácticos que no puede cuidar.

Puede. La mayoría de las plataformas proporcionan las variables globales y __argc __argv. Pero, de nuevo, yo apoyo el comentario de zneak.

P.S. Impulsar el uso :: program_options analizarlos. Por favor, no hacerlo de otra forma en C ++.

¿Hay alguna razón por la que pasa un puntero al espacio que ya se consume es tan malo? Usted no va a obtener ningún ahorro real de eliminar el argumento de la función en cuestión y que podría desencadenar una interesante muestra de fuegos artificiales. Bordeando pila principal () 's llamada con hackery creativa por lo general termina en un comportamiento indefinido, o la confianza en el comportamiento específico del compilador. Ambos son malos para la funcionalidad y portabilidad, respectivamente.

Tenga en cuenta los argumentos en cuestión son punteros a los argumentos, que van a consumir el espacio no importa lo que haces. La conveniencia de un índice de ellos es tan barato como sizeof (int), no veo ninguna razón para no usarlo.

Parece que se trata de optimizar más agresiva y prematuramente, o le pegan con tener que añadir características a código que realmente no quiere meterse. En cualquier caso, hacer las cosas de forma convencional ahorrará tiempo y problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top