O que significa em argc, char * argv []?
em muitos IDE e compiladores de C++, quando gera a função principal para si, parece-se com isto:
int main(int argc, char *argv[])
Quando codifico C++ sem um IDE, apenas com um compilador de linha de comandos, eu digito:
int main()
sem quaisquer parâmetros. O que isso significa, e é vital para o meu programa?
8 answers
argv
e argc
são como os argumentos da linha de comandos são passados para main()
em C e c++.
argc
será o número de cadeias apontadas por argv
. Isto será (na prática) 1 Mais o número de argumentos, como virtualmente todas as implementações irão preparar o nome do programa para o array.
As variáveis são nomeados argc
(contagem de argumento) e argv
(argumento vetor) por convenção, mas que pode ser dada qualquer identificador válido: int main(int num_args, char** arg_strings)
é igualmente valido.
Eles também podem ser omitidos inteiramente, rendendo int main()
, Se você não pretende processar argumentos da linha de comandos.
Tente o seguinte programa:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
Executá - lo com ./test a1 b2 c3
irá produzir
Have 4 arguments:
./test
a1
b2
c3
argc
é o número de argumentos que estão a ser passados para o seu programa a partir da linha de comandos e argv
é a lista de argumentos.
Podes ler os argumentos sabendo o número deles como:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
Suponha que executa o seu programa assim (usando a sintaxe sh
):
myprog arg1 arg2 'arg 3'
Se declarou o seu principal como int main(int argc, char *argv[])
, então (na maioria dos ambientes), o seu main()
será chamado como se fosse:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
No entanto, se declarares o teu principal como int main()
, chamar-se-á algo como
exit(main());
E tu não fazes passar os argumentos.
Duas coisas adicionais para anotar:
- estas são as duas únicas assinaturas mandatadas para
main
. Se um determinado a plataforma aceita argumentos extras ou um tipo de retorno diferente, então isso é uma extensão e não deve ser invocado em um programa portátil. -
*argv[]
e {[9] } são exatamente equivalentes, então você pode escreverint main(int argc, char *argv[])
comoint main(int argc, char **argv)
.
Os parâmetros de main
representam os parâmetros da linha de comandos fornecidos ao programa quando este foi iniciado. O parâmetro argc
representa o número de argumentos da linha de comandos, e char *argv[]
é uma lista de strings (ponteiros de caracteres) que representam os argumentos individuais fornecidos na linha de comandos.
O primeiro parâmetro é o número de argumentos fornecidos e o segundo parâmetro é uma lista de strings que representam esses argumentos.
A função main
pode ter dois parâmetros, argc
e argv
. argc
é um parâmetro inteiro (int
), e é o número de argumentos passados ao programa.
O nome do programa é sempre o primeiro argumento, por isso haverá pelo menos um argumento para um programa e o valor mínimo de argc
será um. Mas se um programa tem dois argumentos, o valor de argc
será três.
O parâmetro argv
aponta para um array de texto e é chamado de argumento vector. É um array de cadeia unidimensional de argumentos de função.
int main();
Esta é uma declaração simples. Não pode aceitar quaisquer argumentos da linha de comandos.
int main(int argc, char* argv[]);
Esta declaração é usada quando o seu programa tem de aceitar os argumentos da linha de comandos. Quando correr assim:
myprogram arg1 arg2 arg3
argc
, or Argument Count, will be set to 4( four arguments), and argv
, or Argument Vetors, will be populated with string pointers to "myprogram", "arg1", "arg2", and "arg3". a invocação do programa (myprogram
) está incluída na argumentos!
Em alternativa, pode usar:
int main(int argc, char** argv);
Isto também é válido.
Há outro parâmetro que pode adicionar:
int main (int argc, char *argv[], char *envp[])
O parâmetro envp
também contém variáveis de ambiente. Cada entrada segue Este formato:
VARIABLENAME=VariableValue
Assim:
SHELL=/bin/bash
A lista de variáveis de ambiente é nula.
Importante: Não utilize nenhum valor argv
ou envp
directamente nas chamadas para system()
! Isto é um enorme buraco de segurança como usuários maliciosos poderiam definir variáveis de ambiente para comandos de linha de comando e (potencialmente) causar danos massivos. Em geral, apenas não use system()
. Há quase sempre uma solução melhor implementada através de bibliotecas C.
Ambos de
int main(int argc, char *argv[]);
int main();
São definições legais do ponto de entrada para um programa C ou C++. Stroustrup: FAQ de estilo e técnica C++ detalha algumas das variações que são possíveis ou legais para a sua função principal.