módulos em c curso de aprofundamento na linguagem c

Post on 16-Apr-2015

107 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Módulos em C

Curso de aprofundamento na linguagem C

Módulos Divisões lógicas de um programa Podem incluir estruturas de dados,

funções, constantes e globais Facilitam a manutenção Compilação mais rápida Reuso de código

Módulos: convenções A main fica num módulo separado e

apenas inclui os outros módulos Compostos por um arquivo .c e por

um arquivo .h Porque 2 arquivos? O que poderia acontecer se fosse

apenas um arquivo?

Header X Sources O que fica no cabeçalho?

Structs e unions Tipos auxiliares (typedef) Constantes Macros Protótipos de funções Declarações de globais

• Declaração não é definição!

Header X Source O que fica no fonte?

Definições de globais Implementações de funções descritas

no header Funções euxiliares que não são

exportadas

Propriedade dos Módulos Podem esconder certos símbolos

para aplicar um nível de “information hiding”

Podemos aplicar alguns conceitos de Orientação a Objetos na construção de módulos

Módulos X Classes Pode ser encarado como uma Classe Várias estruturas de C podem ter

equivalências com os conceitos de OO

Equivalências O módulo todo seria uma classe,

mas o objeto seria definido por uma struct

Atributos agregados na struct Não existem atributos privados em

estruturas Diminui o overhead Cuidado no acesso!

Equivalências Métodos: funções que alteram

membros da struct Convenções:

• Devem receber como 1° parâmetro a struct• Devem ter nome associado à struct

Métodos estáticos: funções que não alteram membros da struct Podem ser definidos como funções

normais

Equivalências Métodos privados: podem ser

definidos apenas adicionando a palavra chave static Não pode ser visto por outros módulos Visibilidade restrita ao arquivo fonte

Equivalências Atributos Estáticos: variáveis globais

Perigo no acesso concorrente Podem ter caráter privado se definidas

como static

Equivalências Herança e Polimorfismo

Atributos na mesma ordem dos pais Utilização de macros Casts

• Polimorfismo forçado

Padrões de codificação Importante para adoção da divisão

baseada em objetos Ausência implica em:

Duplicação de variáveis globais/funções Tempo de produção do programador

diminuído

Padrões de codificação Exemplo de notação

Adição de prefixos ao nome de globais e funções que são referentes a um determinado módulo ou struct• Exemplo:• double conta_creditar(Conta *c, double v);

• Pode ser combinada com algum outro padrão da escolha do usuário

• Notação húngara• Padrão Java de codificação• Padrão Linux

Padrões de codificação Construtores e destrutores

Incentivam o uso de funções Concentram o processo de alocar e

liberar memória, evitando memory leak Exemplo padrões de construtores:

• Alocação externa• void init_conta(Conta *c, int numero, double v);

• Alocação interna• Conta *create_conta(int numero, double v);

Padrões de codificação Destrutores

void destroy_conta(Conta *c);

Preprocessador C Executado antes de qualquer processo de

compilação ou verificação de tipo Comando identificados pelo prefixo “#” Ferramenta cpp utilizada em conjunto

com o gcc Pode ser utilizada em conjunto com

outros tipos de arquivo, mas é otimizada para arquivos C (comentários e estilo de programação)

#include Inclui declarações de outros

arquivos no arquivo atual Substituição da diretiva #include

pelo conteúdo literal do arquivo (copia e cola)

Parâmetros entre <> ou “” Deve receber APENAS arquivos de

cabeçalho

#define Macros

Constantes Substituídas pelo preprocessador

antes da compilação Erros de semântica em Macros

Exemplo SQR

#if, #ifdef, #ifndef Decisões de precompilação Código interno da diretiva é

adicionado ao programa caso a condição seja satisfeita

Código multiplataforma Uso de bibliotecas Construção de headers

#if, #ifdef, #ifndef Utilizados em conjunto com as diretivas

#else #elif #endif

#if e #elif Expressão como parâmetro

• Não existem tipos• Operadores resultam em inteiros • (expressões C)

#if, #ifdef, #ifndef #ifdef e #ifndef

Macros como parâmetro Equivalentes aos

• #if defined • #if !defined

Exemplo de utilização• Arquivos de cabeçalho

#pragma Configuração de opções do

compilador Específico para cada compilador Exemplos GCC:

#pragma GCC poison [name1 name2...] #pragma GCC dependency “arquivo” [comentário]

#pragma Exemplos VC++

#pragma deprecated(nome1, nome2, …) #pragma hdrstop #pragma once

Comandos # e ## Utilizados normalmente dentro de

macros #

Prefixo que converte um parâmetro em string. O valor do parâmetro não é utilizado, e sim apenas o nome

#define STR(x) #x

Comandos # e ## ##

Funde dois tokens• A ## B resulta em AB

struct command{ char *name; void (*function) (void);}; struct command commands[] ={ { "quit", quit_command }, { "help", help_command }, ...};

#define COMMAND(NAME) { #NAME, NAME ## _command } struct command commands[] ={ COMMAND (quit), COMMAND (help), ...};

Macros pré-definidas __LINE__ __FILE__ __cplusplus __DATE__ ...

#error e #warning Emitem mensagens de erro antes da

compilação #error

Emite mensagem e aborta compilação #warning

Apenas emite mensagem

top related