Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Construindo uma Biblioteca O processo para criar uma biblioteca protegida contra redefinições de funções inclui o conhecimento de algumas diretivas Aconselho a ler mais sobre o assunto na internet, principalmente, nos tutoriais. O objetivo de incluir a construção de uma biblioteca no nosso curso foi para mostrar que não é algo tão complicado como parece e porque você, com certeza, precisará criar funções que usará em vários programas. Além disso, seus programas ficarão mais legíveis. Sei que é complicado sugerir endereços, pois amanhã os artigos poderão não estar mais disponíveis. Entretanto, como sugestões: http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node150.html http://www.cplusplus.com/doc/tutorial/ Sendo assim, acrescento alguns elementos retirados dos tutoriais que poderão lhe ajudar neste estudo e que estão delimitados por linhas já que não tem sentido colocá-los entre aspas. ____________________________________________________________________ #ifndef MYHEADER_H #define MYHEADER_H . . . // This will be seen by the compiler only once #endif /* MYHEADER_H */ #ifdef, #ifndef, #if, #endif, #else e #elif Essas diretivas permitem descartar parte do código de um programa se certa condição não for satisfeita. #ifdef permite que uma seção de um programa seja compilada somente se a constante definida que for especificada como parâmetro foi definida, independentlemente de seu valor. Sua operação é: #ifdef nome // código #endif Por exemplo: #ifdef MAX_WIDTH char str[MAX_WIDTH]; #endif Nesse caso, a linha char str[MAX_WIDTH]; só é considerada pelo compilador se a constante definida MAX_WIDTH foi definida anteriormente, independentemente de seu valor. Se não foi definida, essa linha não será incluída no programa. #ifndef serve para o oposto: o código entre a diretiva #ifndef e a diretiva #endif só é compilado se o nome da constante que estiver especificada não tivesse sido definido anteriormente. Por exemplo: 2 #ifndef MAX_WIDTH #define MAX_WIDTH 100 #endif char str[MAX_WIDTH]; Nesse caso, se ao chegar nesse pedaço de código a constante definida MAX_WIDTH ainda não tiver sido definida, seria definida com o valor de 100. Se já existisse, manteria o valor que já tinha (porque o comando #define não será executado). As diretivas #if, #else e #elif (elif = else if) serve para que a porção de código que seja seja compilada somente se a condição especificar estiver de acordo. A condição só serve para avaliar expressões constantes. Por exemplo: #if MAX_WIDTH>200 #undef MAX_WIDTH #define MAX_WIDTH 200 #elsif MAX_WIDTH<50 #undef MAX_WIDTH #define MAX_WIDTH 50 #else #undef MAX_WIDTH #define MAX_WIDTH 100 #endif char str[MAX_WIDTH]; Note como a estrutura das diretivas encadeadas #if, #elsif e #else termina com #endif. #line Quando compilamos um programe a acontecem erros durante o processo de compilação, o compilador mostra o erro que aconteceu precedido pelo nome do arquivo e a linha dentro do arquivo que no qual o erro aconteceu. A diretiva #line nos permite controlar ambas as coisas, o número de linhas dentro dos arquivos de código assim como o nome do arquivo que queremos que apareça quando um erro acontecer. Sua forma é a seguinte: #line número "nome_do_arquivo" No qual número é o número da linha que será atribuída à próxima linha de código. O número de linha de linhas sucessivas será incrementado de um em um a partir dessa. nome_do_arquivo é um parâmetro opcional que serve para substituir o nome do arquivo que queremos que apareça em caso de erro até que outra diretiva mude isso novamente ou que chegue no final do arquivo. Por exemplo: #line 1 "atribuicao de variavel" int a?; 3 Esse código irá gerar um erro que será exibido como um erro no arquivo "atribuicao de variavel", na linha 1. #error Essa diretiva aborta o processo de compilação quando é encontrada, retornando o erro que foi especificado como parâmetro: #ifndef __cplusplus #error E preciso um compilador C++ #endif Esse exemplo aborda o processo de compilação se a constante definida __cplusplus não estiver definida. #include Essa diretiva também tem sido usada arduamente em outras seções desse tutorial. Quando o pré-processador encontra uma diretiva #include, ele a substitui por todo o conteúdo do arquivo especificado. Há duas maneiras para especificar um arquivo para ser incluído: #include "file" #include <file> A única diferença entre ambas as expressões são os diretórios no qual o compilador irá procurar pelo arquivo. No primeiro caso em que o arquivo é especificado entre aspas, o arquivo é procurado no mesmo diretório que inclui o arquivo contendo a diretiva. Caso não esteja lá, o compilador procura pelo arquivo nos diretórios padrões, que estão configurados para procurar pelos arquivos de cabeçalho padrão. Se o nome do arquivo estiver entre sinais de menor e maior <>, o arquivo é procurado diretamente onde o compilador está configurado para procurar pelos arquivos de cabeçalho padrão. #pragma Essa diretiva é usada para especificar diversas opções para o compilador. Essas opções são específicas para a plataforma e que compilador que você usa. Consulte o manual ou a referência de seu compilador para mais informações sobre os parâmetros possíveis que podem ser definidos com #pragma. ____________________________________________________________________ Por hora, você poderá colocar as suas funções em um arquivo e salvá-lo com a extensão h. Inclua bibliotecas nesse arquivo caso você faça uso de funções pré-definidas. Onde salvar a biblioteca? 1) Se puder, salve dentro da pasta include onde se encontram todas as bibliotecas. Estando dentro dessa pasta, você poderá chamar: #include <nome.h> 4 2) Se não puder, salve dentro da pasta onde se encontra o arquivo fonte (fica mais fácil). Estando dentro dessa pasta, você poderá chamar: #include ”nome.h” Essa foi a biblioteca usada no último programa da aula. Ela foi salva com o nome minhas.h Código #include <cmath> void arredonda(double a[], int tam) { for(int x=0; x<tam;x++) a[x]=ceil(a[x]); } double media(double n[], int tam) { double soma=0; for(int x=0; x<tam;x++) soma+=n[x]; return soma/tam; } int contaMaioresQue8(double num[], int tam) { int conta=0; for(int x=0; x<tam;x++) if(num[x]>8) conta++; return conta; } No código fonte, como ela foi armazenada no mesmo diretório do arquivo fonte, foi chamada entre aspas. #include <iostream> #include "minhas.h" ... Construindo uma Biblioteca
Compartilhar