Em muitos IDE e compiladores C ++, quando gera a função principal para você, fica assim:
int main(int argc, char *argv[])
Quando codifico C ++ sem um IDE, apenas com um compilador de linha de comando, digito:
int main()
sem nenhum parâmetro. O que isso significa e é vital para o meu programa?
c++
parameters
command-line-arguments
argv
argc
Greg Treleaven
fonte
fonte
int main(int argc, char* argv[], char* envp[])
e imprimir o último argumento.;)
system()
chamadas, consultas de banco de dados, etc. Como sempre, com a entrada do usuário.char **envp
argumento?Respostas:
argv
eargc
é como os argumentos da linha de comando são transmitidos paramain()
C e C ++.argc
será o número de cadeias apontadas porargv
. (Na prática) será 1 mais o número de argumentos, pois praticamente todas as implementações incluirão o nome do programa na matriz.As variáveis são nomeadas
argc
( contagem de argumentos ) eargv
( vetor de argumento ) por convenção, mas podem receber qualquer identificador válido:int main(int num_args, char** arg_strings)
é igualmente válido.Eles também podem ser omitidos inteiramente, produzindo
int main()
, se você não pretende processar argumentos da linha de comandos.Tente o seguinte programa:
Executá-lo com
./test a1 b2 c3
saídafonte
argc
pode ser 0; nesse caso,argv
pode ser NULL. É permitido pelo AFAIK padrão. Nunca ouvi falar de um sistema que faça isso na prática, mas certamente poderia existir e não estaria violando nenhum padrão.argv[argc]
deve ser 0" (C ++ 03 §3.6.1 / 2),argv
não pode ser nulo.*NULL
definitivamente não é igual aNULL
.argc
é o número de argumentos que estão sendo passados para o seu programa a partir da linha de comando eargv
é a matriz de argumentos.Você pode percorrer os argumentos sabendo o número deles, como:
fonte
Suponha que você execute seu programa assim (usando
sh
sintaxe):Se você declarou seu principal como
int main(int argc, char *argv[])
, então (na maioria dos ambientes), vocêmain()
será chamado como se fosse:No entanto, se você declarou seu principal como
int main()
, ele será chamado de algo comoe você não passa os argumentos.
Duas coisas adicionais a serem observadas:
main
. Se uma plataforma específica aceita argumentos extras ou um tipo de retorno diferente, é uma extensão e não deve ser invocada em um programa portátil.*argv[]
e**argv
são exatamente equivalentes, para que você possa escreverint main(int argc, char *argv[])
comoint main(int argc, char **argv)
.fonte
basic.start.main/2
permite explicitamente versões adicionais definidas pela implementaçãomain()
, desde que a implementação forneça as duas versões predefinidas. Portanto, eles não são exatamente não-conformes. O mais comum éenvp
, que é tão bem conhecido em C e C ++ que é literalmente a primeira entrada na secção J.5 (extensões comuns) do padrão C .Os parâmetros para
main
representar os parâmetros da linha de comandos fornecidos ao programa quando ele foi iniciado. Oargc
parâmetro representa o número de argumentos da linha de comando echar *argv[]
é uma matriz de seqüências de caracteres (ponteiros de caracteres) representando os argumentos individuais fornecidos na linha de comando.fonte
argv[0]
é o que o programa que iniciou o programa C deu comoargv[0]
. No caso do Bash, geralmente é (talvez sempre) o nome do caminho do executável, mas o Bash não é o único programa que executa outros programas. É permissisble, embora excêntrica, para usar:char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. Em muitos sistemas, o valor visto pelo programa comoargv[0]
serácat
, mesmo que o executável seja/bin/ls
.A
main
função pode ter dois parâmetros,argc
eargv
.argc
é umint
parâmetro inteiro ( ) e é o número de argumentos passados para o programa.O nome do programa é sempre o primeiro argumento; portanto, haverá pelo menos um argumento para um programa e o valor mínimo de
argc
será um. Mas se um programa tiver dois argumentos, o valor deargc
será três.O parâmetro
argv
aponta para uma matriz de cadeias e é chamado de vetor de argumento . É uma matriz de cadeias unidimensionais de argumentos de função.fonte
Esta é uma declaração simples. Não pode aceitar nenhum argumento de linha de comando.
Esta declaração é usada quando seu programa deve receber argumentos de linha de comando. Quando executado assim:
argc
, ou Contagem de argumentos, será definido como 4 (quatro argumentos) eargv
, ou Vetores de argumentos, serão preenchidos com ponteiros de seqüência de caracteres para "meuprograma", "arg1", "arg2" e "arg3". A chamada do programa (myprogram
) está incluída nos argumentos!Como alternativa, você pode usar:
Isso também é válido.
Há outro parâmetro que você pode adicionar:
O
envp
parâmetro também contém variáveis de ambiente. Cada entrada segue este formato:como isso:
A lista de variáveis de ambiente é terminada por nulo.
IMPORTANTE: NÃO use qualquer
argv
ouenvp
valores diretamente em chamadas parasystem()
! Essa é uma enorme falha de segurança, pois usuários mal-intencionados podem definir variáveis de ambiente para comandos da linha de comando e (potencialmente) causar danos enormes. Em geral, apenas não usesystem()
. Quase sempre há uma solução melhor implementada através das bibliotecas C.fonte
O primeiro parâmetro é o número de argumentos fornecidos e o segundo parâmetro é uma lista de cadeias que representam esses argumentos.
fonte
Ambos
são definições legais do ponto de entrada para um programa C ou C ++. Stroustrup: As Perguntas frequentes sobre estilo e técnica C ++ detalham algumas das variações possíveis ou legais para sua função principal.
fonte
int main()
==>int main(void)
... para compatibilidade e legibilidade. Não sei se todas as versões mais antigas do C permitem que funções void tenham uma lista de parâmetros vazia na declaração.void
é necessário. Não me cite, e agora sei que é um comentário um pouco tolo. Não pode doer, no entanto.