Pergunta

Existe alguma maneira de acessar os argumentos de linha de comando, sem usar o argumento principal?Eu preciso acessá-lo em outra função, e eu prefiro não passá-lo.

Eu preciso de uma solução que necessariamente apenas funciona em Mac OS e Linux com o GCC.

Foi útil?

Solução

Eu não acho que você deva fazê -lo, pois o tempo de execução C preparará os argumentos e passará para o principal VIA int argc, char **argv, não tente manipular o comportamento, hackeando -o, pois seria amplamente não portável ou possivelmente indefinido comportamento !! Atenha -se às regras e você terá portabilidade ... nenhuma outra maneira de fazê -lo além de quebrá -lo ...

Outras dicas

Eu não sei como fazê-lo no MacOS, mas eu suspeito que o truque vou descrever aqui pode ser portado para o MacOS com um pouco de cross-leitura.

No linux você pode usar o chamado ".init_array" do binário ELF, para registrar uma função que é chamada durante o programa initilization (antes de main() é chamado).Esta função tem a mesma assinatura que o normal função main (), execept ele retorna "void".Assim, você pode usar esta função para lembrar ou processo argc, argv[] e vice-presidente executivo[].

Aqui está um código que você pode usar:

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 também pode ser colocado em uma biblioteca, por isso deve adequar com o seu caso.Funciona até mesmo, quando o seu prgram é executado com gnu / linux - gnu / linux não bifurcação de um novo processo, e isso resulta em /proc/self/cmdline mostrando o original valgrind de linha de comando.

PPS:Tenha em mente que, durante este início de execução do programa muitos subsistema ainda não estão totalmente inicializado - eu tentei libc rotinas de e/S, elas parecem funcionar, mas não confie nele, mesmo gloval variáveis podem não ser ainda construído, etc...

Você pode copiá-los em variáveis globais, se você desejar.

No Linux, você pode abrir /proc/self/cmdline (assumindo que /proc está presente) e analise manualmente (isso só é necessário se você precisar de argc/argv antes da main() - por exemplo, em um construtor global - se o caso de passar por meio de vars globais).

Mais soluções estão disponíveis aqui: http://blog.linuxgamepublishishing.com/2009/10/12/argv-and-argc-and-just-how-to-get-them/

Sim, é nojento e não portável, mas se você estiver resolvendo problemas práticos, pode não se importar.

Você pode.A maioria das plataformas de fornecer variáveis globais __argc e __argv.Mas, novamente, eu apoio zneak comentário.

P. S.Usar o boost::program_options para analisá-los.Por favor, não faça isso de qualquer outra forma em C++.

Existe alguma razão pela qual passar um ponteiro para o espaço que já é consumido é tão ruim? Você não receberá nenhuma economia real ao eliminar o argumento para a função em questão e poderá desencadear uma exibição interessante de fogos de artifício. O contorno em torno da pilha de chamadas de Main () com hacker criativo geralmente acaba em comportamento indefinido ou dependência do comportamento específico do compilador. Ambos são ruins para funcionalidade e portabilidade, respectivamente.

Lembre -se de que os argumentos em questão são Ponteiros Para argumentos, eles vão consumir espaço, não importa o que você faça. A conveniência de um índice deles é tão barata quanto o tamanho do (int), não vejo nenhum motivo para não usá -lo.

Parece que você está otimizando de maneira agressiva e prematuramente, ou está preso a ter que adicionar recursos ao código com o qual você realmente não deseja mexer. Em ambos os casos, fazer as coisas convencionalmente economizará tempo e problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top