Definição de tipos

Um dos recursos interessantes fornecidos pela linguagem C consiste na possibilidade de declararmos nossos próprios tipos de dados, a partir da combinação de tipos de dados já fornecidos pela própria linguagem.

A utilidade disso pode parecer banal, mas vamos relembrar a declaração de um ponteiro para uma função. Como discutido nas aulas, essa operação tem uma sintaxe potencialmente desagradável visualmente:

int (*funcaoPtr)(int, int) = nomeDaFuncao;

Agora, imagine criarmos um tipo de dado chamado meuTipo, capaz de armazenar ponteiros para funções que recebem dois inteiros como parâmetro e retorna um número inteiro. Esse recurso pode tornar o nosso código mais legível. Veja como ficaria:

meuTipo funcaoPtr = nomeDaFuncao;

Bem melhor, não?

🧑‍💻 Do conceito ao código

Para sair do campo das ideias, usaremos o typedef, uma palavra-chave em C que permite criar um apelido ("alias" ou um novo nome) para um tipo de dado. O uso do typedef é representado pela sintaxe a seguir:

typedef opcoes nomeDoSeuTipo;

Agora, vamos trabalhar com a criação de um tipo de dado que consiste em ponteiro para inteiro, com a intenção de evitar o uso de int* repetidas vezes.

typedef int* intp;

A partir de agora, intp é um tipo de dado válido, um apelido para int*. Acompanhe o código a seguir:

#include<stdio.h>
#include<stdlib.h>

typedef int* intp;

int main(void){
    int a = 10;
    intp aPtr = &a;
    printf("A -> Valor: %d Endereço: %p | aPtr: %p", a, &a, aPtr);
    return 0;
}

🧙 Definindo um tipo de ponteiro para função

Enfim, chegamos à questão inicial: como podemos criar um tipo de dado que contemple um ponteiro para função? Para isso, vamos relembrar como funciona a declaração de um ponteiro para função:

int (*funcaoPtr)(int, int);

Para declararmos um tipo de dado, pf, usaremos typedef:

typedef int (*pf)(int, int);

Com o programa completo, temos:

#include<stdio.h>
#include<stdlib.h>

typedef int (*pf)(int, int);

int somar(int a, int b){
    return a + b;
}

int main(void){
    pf funcao;
    funcao = somar;
    
    int resultado = funcao(5,7);
    printf("Resultado: %d\n", resultado);
    return 0;
}

📖 Bibliografia

Livros

  • Backes, A. (2018). Linguagem C - Completa e Descomplicada.

Sites