Acesso argumentos de linha de comando sem usar char **argv principal
-
20-09-2019 - |
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.
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.