Publicidade

Aula 28: Protótipo e Macro

Aprenda sobre protótipos de função em C e a macro #define, com exemplos.

📖 O que aprender nesta página
✅ Essencial que você precisa saber
  • Defina constantes com #define PI 3.14159
  • Protótipo: int add(int, int);
  • Macros são pura substituição de texto
⭐ Leia se tiver tempo
  • Armadilhas de macros parecidas com função (SQUARE(3+1))
  • Compilação condicional com #ifdef / #endif
  • const é mais seguro em termos de tipo

Protótipo de função — anunciando uma função com antecedência

Quando você quer colocar a definição de uma função abaixo de main, primeiro precisa anunciá-la com um protótipo.
#include<stdio.h>

int add(int a, int b);   // prototype (no body, semicolon required)

int main(void) {
  printf("%d\n", add(3,5));  // can use it now
}

int add(int a, int b) {      // definition can come later
  return a + b;
}

Por que um protótipo é necessário?

O compilador C lê o código de cima para baixo. Se ele encontra uma chamada para uma função que ainda não viu, gera um erro (ou ao menos um aviso).
Mau exemplo: definir uma função depois de main sem protótipo. O compilador pode avisar e não consegue checar os tipos dos argumentos adequadamente.
Três maneiras de resolver:
  1. Coloque a função acima de main.
  2. Coloque um protótipo acima de main (a abordagem padrão).
  3. Coloque o protótipo em um arquivo de cabeçalho (.h) e use #include.

Macros (#define) — constantes e atalhos

#define é uma diretiva que realiza substituição de texto antes da compilação. É útil para constantes e atalhos curtos parecidos com funções.
#define PI 3.14159       // constant macro
#define MAX_SIZE 100
#define SQ(x) ((x)*(x))   // function-like macro

int main(void) {
  double area = PI * 2.0 * 2.0;
  int a[MAX_SIZE];
  printf("5^2 = %d\n", SQ(5)); // -> ((5)*(5)) = 25
}
Cuidado: macros são pura substituição de texto. SQ(x+1) expande para ((x+1)*(x+1)) — mas sem os parênteses, a aritmética quebra. Sempre envolva cada argumento e o corpo inteiro em parênteses.

Experimente você mesmo — protótipo e macro

proto.c
Saída
Clique em "Executar" para rodar...
💡 Tente também estas ideias
Publicidade

Aulas relacionadas

Funções
Aula 24: Funções (Básico)
Definindo e chamando funções em C.
Funções
Aula 25: Funções (Avançado)
Mergulho profundo em funções C: passagem por valor, pilha de chamadas, recursão.
Funções
Variáveis globais e escopo
Variáveis globais em C, escopo, tempo de vida e static.
← Aula anterior
Aula 27: Geração de números aleatórios
Próxima aula →
Aula 29: Variáveis globais

Quiz de Revisão

Confira sua compreensão desta aula!

Q1. Qual é o propósito de um protótipo de função?

Definir o corpo da função
Informar antecipadamente ao compilador a assinatura da função
Definir uma macro

Protótipos permitem que o compilador verifique os tipos nas chamadas que aparecem antes da definição real da função.

Q2. O que #define PI 3.14 define?

Uma variável
Uma macro (constante)
Uma função

#define é uma macro do pré-processador — realiza substituição de texto antes da compilação, então não usa memória em tempo de execução.

Q3. Qual é a diferença entre #include "myfile.h" e #include <stdio.h>?

Nenhuma diferença
Eles procuram em diretórios diferentes
Um é exclusivo do C++

"" procura primeiro no diretório atual, enquanto <> procura nos diretórios padrão do sistema. Use "" para seus próprios cabeçalhos.

Compartilhe este artigo
Compartilhar no X (Twitter) Compartilhar no Facebook