2008-10-01 16 views
9

Estoy escribiendo una biblioteca que se cargará dinámicamente en C++.¿Cómo puedo acceder a argc y argv en C++ desde una función de biblioteca?

Me gustaría leer argc y argv (por razones de depuración) desde mi código, sin embargo, no tengo acceso a la función principal. ¿Hay alguna manera de recuperar la línea de comandos (tanto la solución de Windows como la de Linux serían buenas).

Gracias, Dan

Respuesta

11

No es la función GetCommandLine() de la API de Win32. En otras plataformas, tendría que guardar argc/argv en algún lugar (¿variable externa?).

12

En Linux, el pseudo-archivo/proc/self/cmdline contiene la línea de comando para el proceso. Cada argumento se termina con un byte 0, y el argumento final es seguido por un byte 0 adicional.

4

puedo sugerir que esto suena como una situación extraña. ¿Estás escribiendo un plugin o algo así? ¿Quizás no deberías acceder a argv/argc?

+0

Estoy de acuerdo. Si una biblioteca necesita acceso a argv y argc, entonces la biblioteca probablemente podría usar un rediseño. – Landon

+1

GTK + necesita (o acepta, no está seguro) argc & argv para analizar, por ejemplo, el parámetro --display. También podría ser útil en este caso; pensar "--debug". – aib

+0

argv y argc se pasan a GTK +, lo cual es perfectamente sensato. A lo que me refería, y lo que DanJ está pidiendo, era una forma de que una biblioteca accediera a argv y argc. – Landon

4

En Windows puede usar GetCommandLine() para obtener un puntero a la línea de comando y luego usar CommandLineToArgvW() para convertir ese puntero a formato argv []. Sin embargo, solo hay una versión amplia (Unicode) disponible.

0

Utilice getpid() y el comando ps.

int pid;

int fd;

char cmd [80];

pid = getpid();

sprintf (cmd, "ps% d", pid);

fd = popen (cmd, "r");

.... líneas deben ser como

.... 1358 ./a.out abc def

5

En las ventanas se puede acceder argc/argv través __argc y __argv. __wargv si desea la versión de caracteres anchos.

+0

gracias por __wargv – Martlark

+0

¡Esta es una idea realmente terrible! Cualquier símbolo cuyo nombre comience con dos guiones bajos está reservado para uso interno por la implementación del compilador. Debería ___nunca___ referirse a estos en el código de usuario. Este es un ejemplo clásico de comportamiento indefinido autoinfligido: cualquier resultado (potencialmente indeseable) es posible. –

+0

¡Buen punto! No estoy seguro de por qué respondí una pregunta de Windows. –

1

En Windows, que utilizan este tipo de cosas para obtener los argumentos:


#include <windows.h> 
#include <string> 
#include <vector> 
#include <cwchar> 
#include <cstdio> 
#include <clocale> 
using namespace std; 

vector<wstring> getArgs() { 
    int argc; 
    wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc); 
    vector<wstring> args; 
    if (argv) { 
     args.assign(argv, argv + argc); 
     LocalFree(argv); 
    } 
    return args; 
} 

int main() { 
    const vector<wstring> argv = getArgs(); 
    setlocale(LC_CTYPE, ".OCP"); 
    for (vector<wstring>::const_iterator i = argv.begin(); i != argv.end(); ++i) { 
     wprintf(L"%s\n", i->c_str()); 
    } 
} 

Editar: Una función getArgs como ese también es útil para MinGW como MinGW no es compatible con un wmain().

0

¿Ha pensado en usar variables de entorno en lugar de la línea de comando? Puede ser más fácil para el usuario según el tipo de aplicaciones en las que se utilizará la biblioteca, y puede usar la función getenv() estándar.

Creo que, en cualquier caso, si su biblioteca va a usar argc y argv, el programa debería ser el que los pase.

1

Esto debería funcionar en Linux:

#include <stdio.h> 
#include <unistd.h> 

void findargs(int *argc, char ***argv) { 
    size_t i; 
    char **p = &__environ[-2]; 
    for (i = 1; i != *(size_t*)(p-1); i++) { 
     p--; 
    } 
    *argc = (int)i; 
    *argv = p; 
} 

int main(int argc, char **argv) { 
    printf("got argc=%d, argv=%p\n", argc, argv); 
    findargs(&argc, &argv); 
    printf("found argc=%d, argv=%p\n", argc, argv); 
    return 0; 
} 

Nota: si falla setenv() ha sido llamado.

Cuestiones relacionadas