Novidade: Metaperguntas agora no próprio Umamão

3

Descobri recentemente que definição e declaração são conceitos diferentes em C.
O que significam estes termos? Para quê servem? Como aplicá-los?

flag

1 Answer

6

A definição de uma variável aloca memória suficiente para ela, enquanto a declaração somente informa ao compilador que existirá uma variável de determinado tipo e com determinado nome.
Se a variável é declarada e atribuída, faz-se necessariamente a definição desta variável.
Quando se declara uma variável extern, não se está definindo a variável, mas sim indicando que ela já existe (em outro módulo, por exemplo) e pode ser utilizada.
Ao utilizar uma declaração sem atribuíção, fica a cargo do compilador a ação a ser tomada (declarar a variável ou defini-la).

#include <stdio.h>

/* as variáveis x e y estão sendo somente declaradas */
extern int x, y;

int main () {
  /* dependendo do compilador, a linha abaixo declara ou define a variável a */
  int a;
  /* a variável b está sendo definida */
  int b = 10;
  return 0;
}

Quando se trata de uma função, é possível declará-la antes de defini-la, através de seu protótipo (em geral no arquivo auxiliar .h, ou então no arquivo principal, porém antes da função main). A definição de uma função é seu código propriamente dito.

#include <stdio.h>

/* declaração da função soma: informa ao compilador que se chama soma, possui dois parâmetros do tipo int e retorna um int */
int soma (int x, int y);

int main () {
  int a, b;
  scanf ("%d %d", &a, &b);
  printf ("%d + %d = %d\n", a, b, soma (a, b));
  return 0;
}

/* definição da função: informa ao compilador o que deve ser feito quando a função soma for chamada */
int soma (int x, int y) {
  return x + y;
}
link|flag
Andréia, no caso da variável "a" do primeiro exemplo, ela está sendo declarada e definida naquele lugar. (isto usando sua nomenclatura) Eu sempre usei o termo declarar para os dois casos. Só que uso declarar como externa para o caso do extern. :-) – Rodolfo Jul 30 at 0:46
Rodolfo, pelo que eu tinha entendido, ficaria a critério do compilador já definir a variável "a" do primeiro exemplo, ou então apenas declará-la - e defini-la somente quando encontrasse uma atribuição. Estou escorregando em algum conceito? – andreavb Jul 30 at 4:06
Outra coisa, sobre "Eu sempre usei o termo declarar para os dois casos.": isso significa que a escolha da nomenclatura é irrelevante? Na literatura, o mais comum é não fazer a distinção? – andreavb Jul 30 at 4:10
1 
Particularmente no caso da variável "a", ela deve ser alocada na pilha e o compilador vai reservar espaço para ela logo no início da função. Por outro lado, se ela for alocada num registrador, então o compilador pode reservar espaço mais para a frente. Um conceito importante de compiladores que pode te ajudar nesta parte é o de "variável viva" que diz que uma variável está viva num lugar se ela foi atribuída anteriormente e (potencialmente) será lida no futuro. – Rodolfo Jul 30 at 16:59

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.