O que deve main () retornar em C e C ++?
-
03-07-2019 - |
Pergunta
O que é a maneira correta (mais eficiente) para definir a função main()
em C e C ++ - int main()
ou void main()
- e por quê?
Se int main()
então return 1
ou return 0
?
Existem inúmeras duplicatas de esta questão, incluindo:
- Quais são as assinaturas válidas para a função
main()
de C? - O tipo de retorno da função
main()
- entre
void main()
eint main()
? - de
main()
assinatura em C ++ - Qual é a declaração adequada de
main()
-? Para C ++ , com uma resposta muito boa de fato. - de funções
main()
em C - Tipo de retorno do método
main()
em C -
int main()
vsvoid main()
em C
Relacionado:
- C ++ -
int main(int argc, char **argv)
- C ++ -
int main(int argc, char *argv[])
- Is
char *envp[]
como um terceiro argumento paramain()
portátil ? - Deve a função
int main()
retornar um valor em todos os compiladores? - por que o tipo da função
main()
em C e C ++ para a esquerda para que o usuário defina? - Por que
int main(){}
compilação? - definições legais de
main()
em C ++ 14?
Solução
O valor de retorno para main
deve indicar como o programa saiu. saída normal é geralmente representado por um valor 0 retorno de main
. saída anormal geralmente é sinalizado por um retorno diferente de zero, mas não existe um padrão de como diferentes de zero códigos são interpretados. Além disso, como referido por outros, void main()
é explicitamente proibido pela C ++ padrão e não deve ser utilizado. C ++ assinaturas main
válidos são:
int main()
e
int main(int argc, char* argv[])
o que equivale a
int main(int argc, char** argv)
É importante notar também que em C ++, int main()
pode ser deixado sem um retorno declaração, altura em que o padrão é retornar 0. Isto também é verdade com um programa de C99. Se return 0;
deve ser omitido ou não está aberto a debate. A gama de assinaturas principais do programa C válido é muito maior.
Além disso, a eficiência não é um problema com a função main
. Ela só pode ser inserido e à esquerda uma vez (marcando o início do programa e terminação) de acordo com o padrão C ++. Para C, o caso é diferente e re-entrar main()
é permitido, mas deve ser evitado.
Outras dicas
A resposta aceita parece ser direcionados para C ++, então eu pensei que eu iria adicionar uma resposta que se refere a C, e isto difere em algumas maneiras.
ISO / IEC 9899: 1989 (C90):
main()
deve ser declarado como qualquer um:
int main(void)
int main(int argc, char **argv)
ou equivalente. Por exemplo, int main(int argc, char *argv[])
é equivalente para a segunda. Além disso, o tipo int
retorno pode ser omitido, pois é um padrão.
Se uma aplicação permitir, main()
pode ser declarada de outras maneiras, mas isso faz com que a implementação do programa definido, e não mais rigorosamente em conformidade.
O padrão define 3 valores para retornar que estão rigorosamente em conformidade (isto é, não depende de implementação comportamento definido): 0
e EXIT_SUCCESS
para um término bem sucedido, e EXIT_FAILURE
para uma rescisão sem sucesso. Quaisquer outros valores não são normalizadas e implementação definido. main()
deve ter uma declaração return
explícita no fim de evitar um comportamento indefinido.
Finalmente, não há nada errado de uma padrões ponto de vista com a chamada main()
a partir de um programa.
ISO / IEC 9899: 1999 (C99):
Para C99, tudo é o mesmo que acima, exceto:
- O tipo
int
retorno não pode ser omitido. - Você pode omitir a instrução de retorno de
main()
. Se você faz, emain()
terminado, há umareturn 0
implícita.
Padrão C - Hospedado Meio Ambiente
Para um ambiente hospedado (que é o normal), o padrão C11 (ISO / IEC 9899: 2011) diz:
5.1.2.2.1 programa de inicialização
A função chamada na inicialização do programa é nomeado
main
. A implementação não declara protótipo para esta função. Ele deve ser definido com um tipo de retorno deint
e sem parâmetros:int main(void) { /* ... */ }
ou com dois parâmetros (referido aqui como
argc
eargv
, embora nenhum nome pode ser utilizado, uma vez que são locais para a função na qual eles são declarados):int main(int argc, char *argv[]) { /* ... */ }
ou equivalente;. 10) ou em algum outro modo definido pela implementação
Se eles forem declarados, os parâmetros para a função principal deve obedecer à seguinte restrições:
- O valor da
argc
deve ser não negativo.argv[argc]
deve ser um ponteiro nulo.- Se o valor da
argc
é maior do que zero, os membros da matrizargv[0]
atravésargv[argc-1]
inclusiva devem conter ponteiros para strings, que são dadas valores por meio de acolhimento antes da inicialização do programa definido pela implementação. o a intenção é fornecer a informação programa determinada antes da inicialização do programa de outras partes do ambiente hospedado. Se o ambiente de acolhimento não é capaz de fornecendo cordas com letras em ambos os maiúsculas e minúsculas, a implementação devem assegurar que as cordas são recebidos em letras minúsculas.- Se o valor da
argc
é maior do que zero, a string apontada porargv[0]
representa o nome do programa;argv[0][0]
será o caractere nulo se o nome do programa não está disponível a partir do ambiente de host. Se o valor daargc
é maior do que um, as cordas apontada porargv[1]
atravésargv[argc-1]
representam os parâmetros do programa.- Os parâmetros
argc
eargv
e as cordas apontado pela matrizargv
deve ser modificáveis ??pelo programa, e mantêm seus valores última armazenados entre o programa inicialização e encerramento do programa.10) Assim,
int
pode ser substituído por um nome typedef definido comoint
, ou do tipo deargv
pode ser escrito comochar **argv
, e assim por diante.
rescisão Programa em C99 ou C11
O valor retornado de main()
é transmitido para o 'ambiente' de uma forma definida pela implementação.
5.1.2.2.3 rescisão Programa
1 Se o tipo de retorno da função
main
é um tipo compatível comint
, um retorno do chamada inicial para a funçãomain
é equivalente a chamar a funçãoexit
com o valor retornado pela funçãomain
como argumento; 11) atingindo o}
que termina o funçãomain
retorna um valor de 0. Se o tipo de retorno não é compatível comint
, o status de terminação voltou para o ambiente de acolhimento não é especificado.11) De acordo com 6.2.4, a vida útil dos objetos com duração de armazenamento automático declarou em
main
terá terminado no primeiro caso, mesmo quando eles não têm neste último.
Note que 0
é obrigatória como 'sucesso'. Você pode usar EXIT_FAILURE
e EXIT_SUCCESS
de <stdlib.h>
se você preferir, mas 0 é bem estabelecida, e assim é 1. Veja também códigos de saída maiores que 255 -?. possíveis
Em C89 (umd daí em Microsoft C), não há nenhuma declaração sobre o que acontece se a função main()
retornos, mas não especifica um valor de retorno; -lo, portanto, leva a um comportamento indefinido.
7.22.4.4 A função
exit
¶5 Finalmente, o controle é devolvido ao meio ambiente host. Se o valor da
status
é zero ouEXIT_SUCCESS
, uma forma do estatuto definido pela implementação término bem-sucedido é retornado. Se o valor dastatus
éEXIT_FAILURE
, uma forma do estatuto definido pela implementação rescisão sem sucesso é retornado. Caso contrário, o status retornado é definido pela implementação.
padrão C ++ - Hospedado Meio Ambiente
A C ++ 11 padrão (ISO / IEC 14882: 2011) diz:
3.6.1 Função principal [basic.start.main]
¶1 Um programa deve conter uma função global chamada principal, que é o início designada do programa. [...]
¶2 Uma implementação não deve predefinir a função principal. Esta função não deve ser sobrecarregado. Deve tem um tipo de retorno do tipo int, mas caso contrário seu tipo é definido pela implementação. todas as implementações deve permitir que ambas as seguintes definições de principal:
int main() { /* ... */ }
e
int main(int argc, char* argv[]) { /* ... */ }
Neste último
argc
formulário deve ser o número de argumentos passados ??para o programa a partir do ambiente em que o programa é executado. Seargc
é diferente de zero esses argumentos devem ser fornecidas emargv[0]
atravésargv[argc-1]
como ponteiros para os caracteres iniciais de cordas de vários bytes de terminação nula (NTMBSs) (17.5.2.1.4.2) eargv[0]
deve ser o ponteiro para o carácter inicial de uma NTMBS que representa o nome usado para invocar o programa ou""
. O valor daargc
deve ser não-negativo. O valor daargv[argc]
deve ser 0. [Nota: Recomenda-se que quaisquer outras (opcional) parâmetros ser adicionado apósargv
. -fim Nota]¶3 A função
main
não devem ser utilizados dentro de um programa. A articulação (3.5) demain
é definido pela implementação. [...]¶5 A instrução de retorno na principal tem o efeito de deixar a função principal (destruir quaisquer objetos com automático duração de armazenamento) e
std::exit
chamando com o valor de retorno como o argumento. Se o controlo atinge a extremidade de principal sem encontrar uma instrução de retorno, o efeito é o de execuçãoreturn 0;
O padrão C ++ explicitamente diz que "[a função principal] deve ter um tipo de retorno do tipo int
, mas caso contrário seu tipo é definido pela implementação", e exige as mesmas duas assinaturas como o padrão C para serem suportados como opções. Assim, um 'void main ()' directamente não é permitido pelo padrão C ++, embora não há nada que possa fazer para impedir a implementação não-padrão permitindo alternativas. Note-se que proíbe C ++ o usuário chamando main
(mas o padrão C não).
Há um parágrafo do §18.5 Iniciar e terminação no C ++ 11 padrão que é idêntico ao parágrafo de §7.22.4.4 A função exit
no C11 padrão (citado acima), para além de uma nota de rodapé (que simplesmente documentos que EXIT_SUCCESS
e EXIT_FAILURE
são definidos em <cstdlib>
).
Padrão C - Comum Extensão
Classicamente, sistemas Unix apoiar uma terceira variante:
int main(int argc, char **argv, char **envp) { ... }
O terceiro argumento é uma lista terminada em null de ponteiros para strings, cada uma das quais é uma variável de ambiente que tem um nome, um sinal de igual e um valor (possivelmente vazio). Se você não usar isso, você ainda pode obter no ambiente via 'extern char **environ;
'. Por um longo tempo, que não have um cabeçalho que declarou, mas o padrão POSIX 2008 agora exige que seja declarada em <unistd.h>
.
Isto é reconhecido pelo padrão C como uma extensão comum, documentado no Anexo J:
argumentos J.5.1 Ambiente
¶1 Em um ambiente hospedado, a função principal recebe um terceiro argumento,
char *envp[]
, que aponta para uma matriz terminada com nulo de ponteiros parachar
, cada uma das quais aponta para uma cadeia que fornece informações sobre o ambiente para esta execução do programa (5.1.2.2.1).
Microsoft C
O Microsoft VS 2010 compilador é interessante. O site diz:
A sintaxe declaração para principal é
int main();
ou, opcionalmente,
int main(int argc, char *argv[], char *envp[]);
Como alternativa, as funções
main
ewmain
pode ser declarada como retornandovoid
(sem valor de retorno). Se você declararmain
ouwmain
como retornando vazio, você não pode retornar um código de saída para o processo pai ou sistema operacional usando uma instrução de retorno. Para retornar um código de saída quandomain
ouwmain
é declarado comovoid
, você deve usar a funçãoexit
.
Não é claro para mim o que acontece (o código de saída é devolvido ao pai ou OS) quando um programa com void main()
faz exit -. Ea MS web site é silencioso demasiado
Curiosamente, MS não prescreve a versão com dois argumentos de main()
que os padrões do C e C ++ requerem. Ele só prescreve uma forma de três argumento que o terceiro argumento é char **envp
, um ponteiro para uma lista de variáveis ??de ambiente.
A página Microsoft também lista algumas outras alternativas -. wmain()
que leva cadeias de caracteres de largura e pouco mais
A Microsoft Visual versão de desta página não lista void main()
como uma alternativa. As versões da Microsoft Visual Studio 2008 avante fazer.
Padrão C - independente Meio Ambiente
Como observado no início, os requisitos acima se aplica a ambientes hospedados. Se você está trabalhando com um ambiente independente (que é a alternativa para um ambiente hospedado), então o padrão tem muito menos a dizer. Para um ambiente independente, a função chamada na necessidade inicialização do programa não ser chamado main
e não há restrições sobre seu tipo de retorno. A norma diz:
5.1.2 ambientes de execução
ambientes de execução Dois são definidos: autônoma e organizada. Em ambos os casos, inicialização do programa ocorre quando uma função C designado é chamado pela execução meio Ambiente. Todos os objetos com duração de armazenagem estática deve ser inicializado (conjunto aos seus valores iniciais) antes de inicialização do programa. O modo e o tempo de tal inicialização são de outro modo não especificado. terminação programa retorna o controle para o ambiente de execução.
5.1.2.1 ambiente Independente
Em um ambiente autônomo (em que a execução do programa C pode ocorrer sem qualquer benefício de um sistema operacional), o nome eo tipo da função chamada na inicialização do programa são definidos pela implementação. Quaisquer instalações da biblioteca disponíveis a um progra autônomom, diferente do conjunto mínimo exigido pela cláusula 4, são definidas pelo implementação.
O efeito do término do programa em um ambiente independente é definido pela implementação.
A referência cruzada com a cláusula 4 Conformidade refere-se a este:
¶5 A conformar estritamente programa deve usar apenas os recursos da linguagem e biblioteca especificada nesta Norma Internacional. 3) Não deve produzir uma saída dependente de qualquer não especificada , indefinido, ou o comportamento implementação-definido, e não deve exceder qualquer limite mínimo implementação.
¶6 As duas formas de conformidade implementação são hospedado e independente . A conformando implementação hospedada deve aceitar qualquer programa rigorosamente em conformidade. A em conformidade independente implementação deve aceitar qualquer programa rigorosamente de acordo em que o uso das características especificadas na cláusula biblioteca (cláusula 7) se limita ao conteúdo do padrão cabeçalhos
<float.h>
,<iso646.h>
,<limits.h>
,<stdalign.h>
,<stdarg.h>
,<stdbool.h>
,<stddef.h>
,<stdint.h>
, e<stdnoreturn.h>
. Uma implementação conforme pode ter extensões (incluindo adicional funções de biblioteca), desde que não altere o comportamento de qualquer programa rigorosamente em conformidade. 4)¶7 A conformando programa é aquele que é aceitável para uma implementação em conformidade. 5)
3) A rigorosamente de acordo programa pode usar recursos condicionais (ver 6.10.8.3), desde que o uso é guardada por uma directiva de pré-processamento inclusão condicional apropriado usando a macro relacionado. Por exemplo:
#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */ /* ... */ fesetround(FE_UPWARD); /* ... */ #endif
4) Isto implica que uma conformidade reservas de implementação há identificadores diferentes daqueles explicitamente reservadas nesta Norma.
5) rigorosamente de acordo programas se destinam a ser maximamente portátil entre conforme implementações. programas de conformidade pode depender de recursos não-portáteis de uma implementação em conformidade.
É notável que a única cabeçalho exigido de um ambiente independente que realmente define quaisquer funções é <stdarg.h>
(e mesmo aqueles podem ser - e são frequentemente - apenas macros).
padrão C ++ - independente Meio Ambiente
Assim como o padrão C reconhece tanto o ambiente hospedado e autônomo, o mesmo acontece com o padrão C ++. (Citações de ISO / IEC 14882:. 2011)
o cumprimento 1.4 Implementação [intro.compliance]
¶7 dois tipos de implementações são definidas: a implementação hospedada e autônomo implementação . Para uma implementação hospedada, esta Norma define o conjunto de bibliotecas disponíveis. Um autônomo implementação é aquele em que a execução pode ter lugar sem o benefício de um sistema operacional, e tem um conjunto definido pela implementação de bibliotecas que inclui algumas bibliotecas de suporte ao idioma (17.6.1.3).
¶8 Uma implementação conforme pode ter extensões (incluindo funções de biblioteca adicionais), desde que não altere o comportamento de qualquer programa bem-formado. Implementações são necessárias para diagnosticar programas que usar essas extensões que são mal-formados de acordo com esta Norma. Tendo feito isso, no entanto, eles podem compilar e executar tais programas.
¶ 9 Cada aplicação deve incluir documentação que identifica todas as construções que não suportam condicionalmente-suportado e define todas as características específicas da localidade. 3
3) Essa documentação também define o comportamento definido pela implementação; ver 1.9.
17.6.1.3 Independente implementações [o cumprimento]
Dois tipos de implementações são definidas: hosted e independente (1,4). Para uma implementação hospedada, esta Norma descreve o conjunto de cabeçalhos disponíveis.
A implementação independente tem um conjunto de cabeçalhos definido pela implementação. Este conjunto deve incluir, pelo menos, os cabeçalhos mostrados na Tabela 16.
a versão fornecida do
<cstdlib>
cabeçalho declarará, pelo menos, as funçõesabort
,atexit
,at_quick_exit
,exit
, equick_exit
(18,5). Os outros cabeçalhos listados nesta tabela devem cumprir os mesmos requisitos que para uma implementação hospedada.Tabela 16 - cabeçalhos C ++ para autoportante implementações
Subclause Header(s) <ciso646> 18.2 Types <cstddef> 18.3 Implementation properties <cfloat> <limits> <climits> 18.4 Integer types <cstdint> 18.5 Start and termination <cstdlib> 18.6 Dynamic memory management <new> 18.7 Type identification <typeinfo> 18.8 Exception handling <exception> 18.9 Initializer lists <initializer_list> 18.10 Other runtime support <cstdalign> <cstdarg> <cstdbool> 20.9 Type traits <type_traits> 29 Atomics <atomic>
Que tal usar int main()
em C?
O §5.1.2.2.1 padrão das C11 mostra a notação padrão preferido - int main(void)
- mas há também dois exemplos no padrão que mostram int main()
: §6.5.3.4 ¶8 e §6.7.6.3 ¶20 . Agora, é importante notar que os exemplos não são 'normativo'; eles são apenas ilustrativos. Se houver erros nos exemplos, eles não afetam diretamente o texto principal da norma. Dito isto, eles são fortemente indicativo de comportamento esperado, por isso, se o padrão inclui int main()
em um exemplo, ele sugere que int main()
não é proibido, mesmo que não é a notação preferido.
6.5.3.4 Os operadores
sizeof
e_Alignof
...
¶8 EXEMPLO 3 Neste exemplo, o tamanho de uma matriz de comprimento variável é computadorizada e devolvido a partir de uma função de:
#include <stddef.h> size_t fsize3(int n) { char b[n+3]; // variable length array return sizeof b; // execution time sizeof } int main() { size_t size; size = fsize3(10); // fsize3 returns 13 return 0; }
Eu acredito que main()
deve retornar tanto EXIT_SUCCESS
ou EXIT_FAILURE
. Eles são definidos no stdlib.h
Note que os padrões do C e C ++ definir dois tipos de implementações:. Autônoma e organizada
-
C90 ambiente hospedado
formas permitidos 1 :
int main (void) int main (int argc, char *argv[]) main (void) main (int argc, char *argv[]) /*... etc, similar forms with implicit int */
Comentários:
Os dois primeiros são explicitamente declarado como as formas admitidas, os outros estão implicitamente permitida porque C90 permitido "int implícita" para o tipo de retorno e os parâmetros de função. é permitida nenhuma outra forma.
-
C90 ambiente autônomo
Qualquer forma ou nome principal é permitido 2 .
-
C99 ambiente hospedado
formas permitidos 3 :
int main (void) int main (int argc, char *argv[]) /* or in some other implementation-defined manner. */
Comentários:
C99 removido "int implícita" para
main()
não é mais válido.Um estranho, frase ambígua "ou de alguma outra maneira definido pela implementação" foi introduzido. Isto pode ser interpretado como "os parâmetros para
int main()
pode variar" ou como "principal pode ter qualquer forma definida pela implementação".Alguns compiladores ter escolhido para interpretar o padrão neste último caminho. Indiscutivelmente, não se pode facilmente estado que eles não estão rigorosamente de acordo citando o padrão em si mesmo, uma vez que está é ambíguo.
No entanto, para permitir formas completamente selvagens de
main()
foi provavelmente (?) Não a intenção desta nova sentença. A lógica C99 (não normativo) implica que a sentença se refere a parâmetros adicionais paraint main
4 .No entanto, a seção de encerramento do programa ambiente hospedado, em seguida, continua discutindo sobre o caso em que principal não retorna int 5 . Embora essa seção não é normativa para como principal deve ser declarado, ele definitivamente implica que o principal pode ser declarado de uma forma completamente definido pela implementação mesmo em sistemas hospedados.
-
C99 ambiente autônomo
Qualquer forma ou nome principal é permitido 6 .
-
C11 ambiente hospedado
formas permitidos 7 :
int main (void) int main (int argc, char *argv[]) /* or in some other implementation-defined manner. */
-
C11 ambiente autônomo
Qualquer forma ou nome principal é permitido 8 .
Note que int main()
não foi listado como uma forma válida para qualquer aplicação hospedada do C em qualquer uma das versões acima. Em C, ao contrário do C ++, ()
e (void)
têm significados diferentes. O primeiro é uma característica obsolescente que pode ser removido a partir da língua. Veja as instruções de linguagem futuro C11:
6.11.6 declarators Função
O uso de declarators função com parênteses vazios (não protótipo de formato tipo de parâmetro declarators) é uma característica obsoleta.
-
C ++ 03 ambiente hospedado
formas permitidos 9 :
int main () int main (int argc, char *argv[])
Comentários:
Observe o parêntese vazia na primeira forma. C ++ e C são diferentes neste caso, porque em C ++ Isto significa que a função não tem parâmetros. Mas em C isso significa que ele pode tomar qualquer parâmetro.
-
C ++ 03 ambiente autônomo
O nome da função chamada na inicialização é definido pela implementação. Se for chamado
main()
deve seguir as formas declaradas 10 :// implementation-defined name, or int main () int main (int argc, char *argv[])
-
C ++ 11 ambiente hospedado
formas permitidos 11 :
int main () int main (int argc, char *argv[])
Comentários:
O texto da norma foi alterada, mas tem o mesmo significado.
-
C ++ 11 ambiente autônomo
O nome da função chamada na inicialização é definido pela implementação. Se for chamado
main()
deve seguir as formas declaradas 12 :// implementation-defined name, or int main () int main (int argc, char *argv[])
Referências
-
ANSI X3.159-1989 2.1.2.2 ambiente hospedado. "Program arranque "
A função chamada na inicialização do programa é nomeado principal. o implementação declara nenhum protótipo para esta função. Será definido com um tipo de retorno de int e sem parâmetros:
int main(void) { /* ... */ }
ou com dois parâmetros (referido aqui como argc e argv, embora possa ser utilizada qualquer nomes, como eles são locais para a função na qual eles são declarados):
int main(int argc, char *argv[]) { /* ... */ }
-
ANSI X3.159-1989 2.1.2.1 ambiente Independente:
Em um ambiente autônomo (em que a execução do programa C pode demorar lugar sem qualquer benefício de um sistema operacional), o nome eo tipo da função chamada na inicialização do programa são definidos pela implementação.
-
ISO 9899: 1999 5.1.2.2 ambiente Hosted -> 5.1.2.2.1 programa de inicialização
A função chamada na inicialização do programa é nomeado principal. o implementação declara nenhum protótipo para esta função. Será definido com um tipo de retorno de int e sem parâmetros:
int main(void) { /* ... */ }
ou com dois parâmetros (referido aqui como argc e argv, embora possa ser utilizada qualquer nomes, como eles são locais para a função na qual eles são declarados):
int main(int argc, char *argv[]) { /* ... */ }
ou equivalente; 9) ou em algum outro implementação definida maneira.
-
Justificativa para Norma Internacional - Linguagens de Programação - C, Revisão 5.10. 5.1.2.2 ambiente Hosted -> 5.1.2.2.1 programa de inicialização
O comportamento dos argumentos para principal, e da interação de saída, principal e atexit (Veja §7.20.4.2) foi codificado para conter alguma variedade indesejado na representação de argv cordas, e no significado dos valores retornado por principal.
A especificação de argc e argv como argumentos para principal reconhece extensa prática anterior. argv [argc] é necessário para ser um ponteiro nulo para fornecer uma verificação redundante para o fim da lista, também com base na prática comum.
principal é a única função que pode portably ser declarados com zero ou dois argumentos. (O número de argumentos de outras funções deve corresponder exatamente entre invocação e definição.) Este caso especial simplesmente reconhece a prática generalizada de deixar fora os argumentos para principal quando o programa não acessar as strings argumentos programa. Enquanto muitas implementações apoiar mais de dois argumentos para principal tal prática, não é nem abençoado nem proibido pela norma; um programa que define principais com três argumentos não está rigorosamente de acordo (ver §J.5.1.).
-
ISO 9899: 1999 5.1.2.2 ambiente Hosted -> 5.1.2.2.3 rescisão Programa
Se o tipo de retorno da função principal é um tipo compatível com int, um retorno da chamada inicial para a função principal é equivalente a chamar a função de saída com o valor retornado pela função principal como seu argumento; 11), atingindo o
}
que termina a função principal retorna um valor de 0. Se o tipo de retorno não é compatível com int, o status de terminação voltou para o ambiente de acolhimento não é especificado. -
ISO 9899: 1999 5.1.2.1 ambiente Independente
Em um ambiente autônomo (em que a execução do programa C pode ocorrer sem qualquer benefício de um sistema operacional), o nome eo tipo da função chamada na inicialização do programa são a implementação definida.
-
ISO 9899: 2011 5.1.2.2 ambiente Hosted -> 5.1.2.2.1 programa de inicialização
Esta seção é idêntico ao C99 citado acima.
-
ISO 9899: 1999 5.1.2.1 ambiente Independente
Esta seção é idêntico ao C99 citado acima.
-
ISO 14882: 2003 3.6.1 Função principal
Uma implementação não deve predefinir a função principal. Esta função não deve ser sobrecarregado. Ele deve ter um tipo de retorno do tipo int, mas caso contrário seu tipo é definido pela implementação. Todas as implementações devem permitir que ambas as seguintes definições de principal:
int main() { /* ... */ }
e
int main(int argc, char* argv[]) { /* ... */ }
-
ISO 14882: 2003 3.6.1 Função principal
É a implementação-definido se um programa em um ambiente independente é necessária para definir uma função principal.
-
ISO 14882: 2011 3.6.1 Função principal
Uma implementação não deve predefinir a função principal. Esta função não deve ser sobrecarregado. Ele deve ter um tipo de retorno do tipo int, mas caso contrário seu tipo é definido pela implementação. Todas as implementações devem permitir que tanto
- uma função de () retornando int e
- uma função de (int, ponteiro de ponteiro de carvão animal) retornando int
como o tipo de principal (8.3.5).
-
ISO 14882: 2011 3.6.1 Função principal
Esta seção é idêntica à C ++ 03 um citados acima.
Voltar 0 em caso de sucesso e não-zero para erro. Este é o padrão usado pelo UNIX e DOS scripting para descobrir o que aconteceu com o seu programa.
main()
em C89 e K & R C tipos de retorno não especificado padrão para ‘int`.
return 1? return 0?
-
Se você não escrever uma instrução de retorno no
int main()
, o{
fechamento retornará 0 por padrão. -
return 0
oureturn 1
será recebido pelo processo pai. Em uma casca de ele entra em uma variável de shell, e se você estiver executando o seu formulário de programa de uma concha e não usando essa variável, então você não precisa se preocupar com o valor de retorno demain()
.
Consulte Como posso conseguir o meu principal função voltou? .
$ ./a.out
$ echo $?
Desta forma, você pode ver que é a variável $?
que recebe o byte menos significativo do valor de retorno de main()
.
Em Unix e scripts DOS, return 0
em caso de sucesso e diferente de zero para erros geralmente são devolvidos. Este é o padrão usado por Unix e DOS scripting para descobrir o que aconteceu com o seu programa e controlar todo o fluxo.
Tenha em mente que, mesmo que você está retornando um int, alguns sistemas operacionais (Windows) truncar o valor devolvido a um único byte (0-255).
O valor de retorno pode ser usado pelo sistema operacional para verificar como o programa foi fechado.
Voltar valor 0 significa geralmente OK na maioria dos sistemas operacionais (os que eu posso pensar de qualquer maneira).
Ele também pode ser verificado quando você chamar um processo de si mesmo, e ver se o programa saiu e terminou corretamente.
de não apenas uma convenção de programação.
O valor de retorno de shows main()
como o programa saiu. Se o valor de retorno é zero
isso significa que a execução foi bem sucedida enquanto qualquer valor diferente de zero irá representar que algo correu mal na execução.
Eu estava sob a impressão de que especifica padrão que principal não precisa de um valor de retorno como um retorno bem sucedido baseou OS (zero em um poderia ser um sucesso ou um fracasso em outro), portanto, a ausência de retorno foi um sugestão para o compilador para inserir o próprio retorno bem sucedido.
No entanto, eu normalmente retornar 0.
Retornando 0 deve dizer ao programador que o programa foi concluído com êxito o trabalho.
Omitir return 0
Quando um programa C ou C ++ chega ao fim da main
o compilador irá gerar automaticamente o código para retornar 0, por isso não há necessidade de colocar return 0;
explicitamente no final do main
.
Nota: quando faço esta sugestão, é quase invariavelmente seguido por um dos dois tipos de comentários: "Eu não sabia que" ou "Isso é um mau conselho!" Meu raciocínio é que ele é seguro e útil para dependem do comportamento do compilador explicitamente apoiada pela norma. Para C, uma vez que C99; ver ISO / IEC 9899: 1999 secção 5.1.2.2.3:
[...] um retorno da chamada inicial para a função
main
é equivalente a chamar a funçãoexit
com o valor retornado pela funçãomain
como argumento; atingindo o}
que termina a funçãomain
retorna um valor de 0.
for C ++, uma vez que o primeiro padrão em 1998; ver ISO / IEC 14882: 1998 seção 3.6.1:
Se o controle chega ao fim da principal sem encontrar uma instrução de retorno, o efeito é o de executar return 0;
Todas as versões de ambos os padrões, desde então (C99 e C ++ 98) mantiveram a mesma idéia. Contamos com funções membro geradas automaticamente em C ++, e algumas pessoas escrevem declarações return;
explícitas no final de uma função void
. Razões contra a omissão parece resumir-se a " parece estranho ". Se, como eu, você está curioso sobre a razão para a mudança para o padrão C ler esta pergunta . Observe também que no início de 1990 este foi considerado "prática descuidada" porque era um comportamento indefinido (embora amplamente suportado) no momento.
Além disso, o orientações núcleo ++ C contém múltiplas instâncias de omitir return 0;
no final do main
e há casos em que um retorno explícito é escrito. Embora ainda não há uma orientação específica sobre este tema específico nesse documento, que parece, pelo menos uma aprovação tácita da prática.
Então eu defensor omiti-lo; outros discordam (muitas vezes com veemência!) Em qualquer caso, se você encontrar o código que omite-lo, você vai saber que ele é explicitamente apoiado pelo padrão e você sabe o que significa.
O que o retorno depende do que você quer fazer com o executável. Por exemplo, se você estiver usando o seu programa com um shell de linha de comando, então você precisa retornar 0 para um sucesso e um diferente de zero para o fracasso. Então você seria capaz de usar o programa em conchas com o processamento condicional, dependendo do resultado do seu código. Além disso, você pode atribuir qualquer valor diferente de zero como por sua interpretação, por exemplo, para erros críticos diferentes pontos de saída programa poderia terminar um programa com diferentes valores de saída, e que está disponível para o shell chamando que pode decidir o que fazer inspecionando o valor retornado.
Se o código não se destina ao uso com conchas e o valor retornado não incomodar ninguém, então ele pode ser omitido. Eu pessoalmente uso o int main (void) { .. return 0; .. }
assinatura
Se você realmente tem questões relacionadas com a eficiência de retornar um número inteiro de um processo, você provavelmente deve evitar chamar esse processo tantas vezes que esse valor de retorno se torna um problema.
Se você está fazendo isso (chamar um processo tantas vezes), você deve encontrar uma maneira de colocar a sua lógica diretamente dentro do chamador, ou em um arquivo DLL, sem alocar um processo específico para cada chamada; as múltiplas atribuições processo trazê-lo o problema de eficiência relevante neste caso.
Em detalhe, se você só quer saber se o retorno 0 é mais ou menos eficiente do que retornar 1, pode depender do compilador, em alguns casos, mas genericamente, assumindo que eles são lidos a partir da mesma fonte (local, campo, constante, embutido no código, resultado da função, etc.) que exige exatamente o mesmo número de ciclos de relógio.
O que é a maneira correta (mais eficiente) para definir a função main () em C e C ++ - int main () ou void main () -? E porque
As palavras "(mais eficiente)" não mudam a questão. A menos que você está em um ambiente autônomo, há uma maneira universalmente correta para main()
declarar, e isso é como retornar int.
O que deve
main()
retorno em C e C ++?
Não é o que deve retorno main()
, é o que faz main()
retorno. main()
é, naturalmente, uma função que alguém chama outra pessoa. Você não tem nenhum controle sobre o código que chama main()
. Portanto, você deve declarar main()
com uma assinatura tipo correto de acordo com o seu interlocutor. Você simplesmente não têm qualquer escolha na matéria. Você não tem que se perguntar o que é mais ou menos eficiente, ou o que é melhor ou pior estilo, ou qualquer coisa assim, porque a resposta já está perfeitamente bem definido, para você, pela C e + padrões C. Apenas segui-los.
Se int main (), em seguida, retornar 1 ou retornar 0?
0 para o sucesso, diferente de zero para o fracasso. Novamente, não é algo que você precisa (ou para) escolher: é definido pela interface você deveria ser em conformidade com
.Aqui está uma pequena demonstração do uso de códigos de retorno ...
Ao utilizar as várias ferramentas que o terminal Linux fornece um pode usar o código de retorno por exemplo, para o tratamento de erros após o processo foi concluído. Imagine que o seguinte myfile arquivo de texto está presente:
Este é um exemplo a fim de verificar como funciona o grep.
Quando você executar o comando grep um processo é criado. Uma vez que é através (e não quebrar) ele retorna algum código entre 0 e 255. Por exemplo:
$ grep order myfile
Se você fizer
$ echo $?
$ 0
Você receberá um 0. Por quê? Porque grep encontrado um fósforo e retornou um código de saída 0, que é o valor habitual para sair com um sucesso. Vamos verificar-lo novamente, mas com algo que não está dentro do nosso arquivo de texto e, portanto, nenhuma correspondência será encontrada:
$ grep foo myfile
$ echo $?
$ 1
Desde grep não conseguiu igualar o "foo" token com o conteúdo do nosso arquivo o código de retorno é de 1 (este é o caso usual quando ocorre uma falha, mas como dito acima você tem a abundância de valores para escolher).
Agora o seguinte script bash (simplesmente digitá-lo em um terminal Linux), embora muito básico deve dar uma ideia da manipulação de erro:
$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found
Depois da segunda linha nada é impresso ao terminal uma vez que "foo" feita retorno grep 1 e verificar se o código de retorno de grep foi igual a 0. A segunda ecos instrução condicional a sua mensagem na última linha, uma vez que é verdade devido ao check-== 1.
Como você pode ver se você está chamando isso e esse processo às vezes é essencial para ver o que ele está de volta (pelo valor de retorno de main ()).