O significado de ambos me escapa.
c
declaration
terminology
definition
c++-faq
Maciek
fonte
fonte
Respostas:
Uma declaração introduz um identificador e descreve seu tipo, seja um tipo, objeto ou função. Uma declaração é o que o compilador precisa para aceitar referências a esse identificador. Estas são declarações:
Uma definição realmente instancia / implementa esse identificador. É o que o vinculador precisa para vincular referências a essas entidades. Estas são definições correspondentes às declarações acima:
Uma definição pode ser usada no lugar de uma declaração.
Um identificador pode ser declarado quantas vezes você desejar. Portanto, o seguinte é legal em C e C ++:
No entanto, ele deve ser definido exatamente uma vez. Se você esquecer de definir algo que foi declarado e referenciado em algum lugar, o vinculador não sabe ao que vincular referências e reclama sobre a falta de símbolos. Se você definir algo mais de uma vez, o vinculador não saberá a quais definições vincular referências e queixas sobre símbolos duplicados.
Como o debate sobre o que é uma declaração de classe versus uma definição de classe em C ++ continua aparecendo (em respostas e comentários para outras perguntas), colarei uma citação do padrão C ++ aqui.
Em 3.1 / 2, o C ++ 03 diz:
3.1 / 3 dá alguns exemplos. Dentre elas:
Resumindo: O padrão C ++ considera
struct x;
uma declaração estruct x {};
uma definição . (Em outras palavras, "declaração direta" é um nome impróprio , pois não há outras formas de declaração de classe em C ++.)Agradecimentos a Litb (Johannes Schaub), que desenterrou o capítulo e o verso em uma de suas respostas.
fonte
extern int i
é uma declaração, uma vez que apenas introduz / especificai
. Você pode ter quantosextern int i
em cada unidade de compilação quiser.int i
, no entanto, é uma definição. Denota o espaço para o número inteiro estar nesta unidade de conversão e aconselha o vinculador a vincular todas as referências ai
essa entidade. Se você tiver mais ou menos do que exatamente uma dessas definições, o vinculador irá reclamar.int i;
no escopo arquivo / global ou escopo da função é uma definição tanto em C quanto em C ++. Em C, porque aloca armazenamento, e em C ++, porque não possui o especificador externo ou uma especificação de ligação. Isso equivale à mesma coisa, como diz o sbi: nos dois casos, esta declaração especifica o objeto ao qual todas as referências a "i" nesse escopo devem ser vinculadas.struct A { double f(int, double); double f(int, double); };
inválido, é claro. É permitido em outro lugar embora. Há alguns lugares onde você pode declarar as coisas, mas não define, também:void f() { void g(); }
válido, mas não o seguinte:void f() { void g() { } };
. O que é uma definição e que declaração tem regras sutis quando se trata de modelos - cuidado! +1 para uma boa resposta.Na seção 3.1 do padrão C ++:
O próximo parágrafo declara (ênfase minha) que uma declaração é uma definição, a menos que ...
... declara uma função sem especificar o corpo da função:
... declara um membro estático dentro de uma definição de classe:
... declara um nome de classe:
... contém a
extern
palavra - chave sem um inicializador ou corpo de função:... ou é uma declaração
typedef
ouusing
.Agora, pela grande razão pela qual é importante entender a diferença entre uma declaração e definição: a Regra de Uma Definição . Na seção 3.2.1 do padrão C ++:
fonte
struct x {static int b = 3; };
?b
também seja declaradaconst
. Consulte stackoverflow.com/a/3536513/1858225 e daniweb.com/software-development/cpp/threads/140739/… .Declaração: "Em algum lugar, existe um foo".
Definição: "... e aqui está!"
fonte
Existem casos interessantes em C ++ (alguns deles também em C). Considerar
Pode ser uma definição ou declaração, dependendo do tipo
T
:No C ++, ao usar modelos, há outro caso de borda.
A última declaração não era uma definição. É a declaração de uma especialização explícita do membro estático de
X<bool>
. Ele diz ao compilador: "Se for para instanciarX<bool>::member
, não instancie a definição do membro a partir do modelo primário, mas use a definição encontrada em outro lugar". Para fazer uma definição, você precisa fornecer um inicializadorfonte
Declaração
Definição
fonte
class foo {};
é uma definição de classe , não é?Do padrão C99, 6,7 (5):
Uma declaração especifica a interpretação e os atributos de um conjunto de identificadores. Uma definição de um identificador é uma declaração para esse identificador que:
No padrão C ++, 3.1 (2):
Uma declaração é uma definição, a menos que declare uma função sem especificar o corpo da função, contenha o especificador externo ou uma especificação de ligação e nem um inicializador nem um corpo da função, declare um membro de dados estático em uma declaração de classe, é um declaração de nome de classe ou é uma declaração typedef, uma declaração de uso ou uma diretiva de uso.
Depois, existem alguns exemplos.
Tão interessante (ou não, mas estou um pouco surpreso com isso)
typedef int myint;
é uma definição em C99, mas apenas uma declaração em C ++.fonte
typedef
, isso não significa que ele pode ser repetido em C ++, mas não em C99?Do wiki.answers.com:
O termo declaração significa (em C) que você está dizendo ao compilador sobre tipo, tamanho e, no caso de declaração de função, tipo e tamanho de seus parâmetros de qualquer variável ou tipo ou função definida pelo usuário em seu programa. Nenhum espaço é reservado na memória para qualquer variável em caso de declaração. No entanto, o compilador sabe quanto espaço reservar, caso uma variável desse tipo seja criada.
por exemplo, a seguir estão todas as declarações:
A definição, por outro lado, significa que, além de tudo o que a declaração faz, o espaço também é reservado na memória. Você pode dizer "DEFINIÇÃO = DECLARAÇÃO + RESERVA DE ESPAÇO" a seguir são exemplos de definição:
veja Respostas .
fonte
struct foo {};
é uma definição , não uma declaração. Uma declaração defoo
seriastruct foo;
. A partir disso, o compilador não sabe quanto espaço reservar para osfoo
objetos.struct foo;
é uma declaração, mas não informa ao compilador o tamanho de foo. Eu acrescentaria questruct _tagExample { int a; int b; };
é uma definição. Portanto, neste contexto, é enganoso chamá-lo de declaração. Claro que é uma, já que todas as definições são declarações, mas você parece sugerir que não é uma definição. É uma definição de _tagExample.Atualização do C ++ 11
Como não vejo uma resposta pertinente ao C ++ 11, aqui está uma.
Uma declaração é uma definição, a menos que declare a / n:
enum X : int;
template<typename T> class MyArray;
int add(int x, int y);
using IntVector = std::vector<int>;
static_assert(sizeof(int) == 4, "Yikes!")
;
Cláusulas adicionais herdadas do C ++ 03 pela lista acima:
int add(int x, int y);
extern int a;
ouextern "C" { ... };
class C { static int x; };
struct Point;
typedef int Int;
using std::cout;
using namespace NS;
Uma declaração de modelo é uma declaração. Uma declaração de modelo também é uma definição se sua declaração define uma função, uma classe ou um membro de dados estático.
Exemplos do padrão que diferencia entre declaração e definição que achei úteis para entender as nuances entre eles:
fonte
Definição:
A definição associa a variável a um tipo e aloca memória, enquanto a declaração apenas especifica o tipo, mas não aloca memória. A declaração é mais útil quando você deseja consultar a variável antes da definição.
* Não confunda definição com inicialização. Ambos são diferentes, a inicialização dá valor à variável. Veja o exemplo acima.
A seguir estão alguns exemplos de definição.
Agora , declaração de função:
Observe o ponto-e-vírgula no final da função, por isso diz que é apenas uma declaração. O compilador sabe que em algum lugar do programa essa função será definida com esse protótipo. Agora, se o compilador receber uma chamada de função, algo como isto
O compilador lançará um erro dizendo que não existe essa função. Porque ele não possui nenhum protótipo para essa função.
Observe a diferença entre dois programas.
Programa 1
Neste, a função de impressão é declarada e definida também. Como a chamada de função está vindo após a definição. Agora veja o próximo programa.
Programa 2
É essencial porque a chamada de função precede a definição, portanto o compilador deve saber se existe alguma função. Então, declaramos a função que informará o compilador.
Definição:
Essa parte da definição de uma função é chamada de Definição. Diz o que fazer dentro da função.
fonte
int a; //declaration; a=10; //definition
Isso está completamente errado. Ao falar sobre objetos de duração de armazenamento automático (objetos declarados dentro de uma definição de função que não são declarados com outro especificador de classe de armazenamento como extern), essas são sempre definições.definição significa função real escrita e declaração significa função de declaração simples para, por exemplo
e
esta é a definição da função myfunction
fonte
Regra prática:
Uma declaração informa ao compilador como interpretar os dados da variável na memória. Isso é necessário para todo acesso.
Uma definição reserva a memória para tornar a variável existente. Isso precisa acontecer exatamente uma vez antes do primeiro acesso.
fonte
Para entender os substantivos, vamos nos concentrar primeiro nos verbos.
declarar - anunciar oficialmente; proclamar
define - para mostrar ou descrever (alguém ou algo) clara e completamente
Então, quando você declara algo, basta dizer o que é .
Essa linha declara uma função C chamada
sum
que recebe dois argumentos do tipoint
e retorna anint
. No entanto, você não pode usá-lo ainda.Quando você fornece como realmente funciona , essa é a definição.
fonte
Para entender a diferença entre declaração e definição, precisamos ver o código do assembly:
e isso é apenas definição:
Como você pode ver, nada muda.
A declaração é diferente da definição porque fornece informações usadas apenas pelo compilador. Por exemplo, uint8_t diz ao compilador para usar a função asm movb.
Veja que:
A declaração não possui uma instrução equivalente, porque não é algo a ser executado.
Além disso, a declaração informa ao compilador o escopo da variável.
Podemos dizer que a declaração é uma informação usada pelo compilador para estabelecer o uso correto da variável e por quanto tempo alguma memória pertence a determinada variável.
fonte
Não foi possível declarar, nos termos mais gerais possíveis, que uma declaração é um identificador no qual nenhum armazenamento é alocado e uma definição realmente aloca armazenamento de um identificador declarado?
Um pensamento interessante - um modelo não pode alocar armazenamento até que a classe ou função esteja vinculada às informações de tipo. Então, o identificador de modelo é uma declaração ou definição? Deve ser uma declaração, já que nenhum armazenamento é alocado e você está simplesmente 'criando um protótipo' da classe ou função do modelo.
fonte
template<class T> struct foo;
é uma declaração de modelo , e assim étemplate<class T> void f();
. As definições de modelo espelham as definições de classe / função da mesma maneira. (Observe que o nome de um modelo não é um tipo ou nome de função . Um lugar onde você pode ver isso é quando não é possível transmitir um modelo como parâmetro de tipo de outro modelo. Se você deseja passar modelos em vez de tipos, precisa de parâmetros de modelo. )Encontrar respostas semelhantes aqui: Perguntas entrevista técnica em C .
Uma declaração fornece um nome para o programa; uma definição fornece uma descrição exclusiva de uma entidade (por exemplo, tipo, instância e função) dentro do programa. As declarações podem ser repetidas em um determinado escopo; ele introduz um nome em um determinado escopo.
Uma declaração é uma definição, a menos que:
Uma definição é uma declaração, a menos que:
fonte
Isso vai parecer muito extravagante, mas é a melhor maneira de manter os termos em mente:
Declaração: Imagine Thomas Jefferson fazendo um discurso ... "DECLARO QUE ESTE FOO EXISTE NESTE CÓDIGO DE ORIGEM !!!"
Definição: imagine um dicionário, você está procurando Foo e o que realmente significa.
fonte
Uma declaração apresenta um nome de símbolo para o compilador. Uma definição é uma declaração que aloca espaço para o símbolo.
fonte
De acordo com o manual da biblioteca GNU C ( http://www.gnu.org/software/libc/manual/html_node/Header-Files.html )
fonte
O conceito de Declaração e Definição formará uma armadilha quando você estiver usando a classe de armazenamento externo, porque sua definição estará em outro local e você estará declarando a variável no seu arquivo de código local (página). Uma diferença entre C e C ++ é que, em C, as declarações são feitas normalmente no início de uma função ou página de código. Em C ++, não é assim. Você pode declarar em um local de sua escolha.
fonte
Meu exemplo favorito é "int Num = 5" aqui sua variável é 1. definida como int 2. declarada como Num e 3. instanciada com um valor de cinco. Nós
Uma classe ou estrutura permite alterar como os objetos serão definidos quando usados posteriormente. Por exemplo
Quando aprendemos a programar, esses dois termos geralmente são confundidos, porque geralmente fazemos as duas coisas ao mesmo tempo.
fonte
Etapas de uma geração executável:
No estágio 2 (tradutor / compilador), as declarações de declaração em nosso código informam ao compilador que essas coisas vamos usar no futuro e você poderá encontrar a definição posteriormente, o que significa:
e (3) estágio (vinculador) precisa de definição para vincular as coisas
fonte
Existem algumas definições muito claras espalhadas por todo o K&R (2ª edição); ajuda colocá-los em um único lugar e lê-los como um:
fonte
Declaração significa dar nome e tipo a uma variável (no caso de declaração de variável), por exemplo:
ou forneça o nome, digite o tipo de retorno e o tipo de parâmetro (s) para uma função sem corpo (no caso de declaração de função), por exemplo:
Considerando que definição significa atribuir valor a uma variável (no caso de definição de variável), por exemplo:
ou fornecer / adicionar corpo (funcionalidade) a uma função é chamado de definição de função, por exemplo:
muitas declarações e definições de tempo podem ser feitas juntas como:
e:
Nos casos acima, definimos e declaramos variáveis
i
efunction max()
.fonte
int x;