Elementos de Linguagem C Parte II Elementos de linguagem C Parte II 1
Macros O pré-processador da linguagem C suporta a substituição de macros, criadas com #define nome_macro texto de substituição As macros admitem parâmeros #define nome_macro(param) texto com param nome_macro(ola) origina: texto com ola Uma macro pode ser definida em várias linhas desde que terminadas por '\' Se uma macro contiver mais do que um statement, deve escrever-se de forma a evitar ambiguidades, nomeadamente quando usada em if-else #define nome_macro do{ \ statement1; \ statement2; \ }while(0) Elementos de linguagem C Parte II 2
Macros Operador # O operador # aplicado a um parâmetro produz uma string com o texto desse parâmetro Exemplo: #define print(param) \ printf("valor de " #param ": %d\n", param); Se existir um int x, escrevendo print(x) expande para: printf("valor de " "x" ": %d\n", x); Se x tiver o valor 10, resulta na consola: valor de x: 10 Elementos de linguagem C Parte II 3
Macros Operador ## O operador ## entre duas palavras do texto de substituição produz uma única palavra com a junção daquelas. Exemplo: #define declara_var(param) \ int var ## param; A utilização declara_var(1) declara_var(2) declara_var(3) Expande para int var1; int var2; int var3; Elementos de linguagem C Parte II 4
Inclusão de ficheiros A directiva #include promove a abertura do ficheiro indicado e a compilação do seu conteúdo, como se pertencesse ao ficheiro onde se encontra a directiva Os ficheiros incluídos podem, por sua vez, incluir outros A aplicação mais frequente deste mecanismo é a publicação de protótipos de funções definidas num módulo de programa e usadas noutro O nome do ficheiro incluído é delimitado por < > ou por "" conforme se trate de um ficheiro de sistema ou definido pelo programador #include <stdio.h> /* standard input-output header-file */ #include "mymodule.h" /* definições relativas a mymodule.c */ Elementos de linguagem C Parte II 5
Programas com módulos Na construção de programas em vários módulos, a compilação de cada módulo origina um módulo compilado; a ligação produz o executável a partir dos módulos compilados Cada módulo pode definir variáveis e funções usadas no mesmo módulo ou noutros Se em vários módulos for declarada uma variável externa, com o mesmo nome, a ligação localiza-a como uma única variável, partilhada entre esses módulos. Por razões de estruturação, recomenda-se que a interface entre módulos seja realizada através de funções e não por variáveis partilhadas Se um módulo utilizar uma função definida noutro, sem conhecer o seu protótipo, considera-a com retorno inteiro e parâmetros correspondentes à chamada realizada Para assegurar a coerência entre as funções definidas e a sua utilização, usa-se o mecanismo de inclusão para declarar, nos módulos de definição e de utilização, o protótipo da função Elementos de linguagem C Parte II 6
Programas com módulos main.c #include "myfunc.h"... int main(void){ }... x = myfunc(1, 2);... return 0; myfunc.h int myfunc(int a, int b); myfunc.c #include "myfunc.h" int myfunc(int a, int b){ }... return...; Elementos de linguagem C Parte II 7
Compilação condicional # if expressão... /* compilado se a expressão for!= 0 */ #else... /* compilado no caso contrário */ #endif # ifdef identificador... /* compilado se o identificador estiver definido */ #endif # ifndef identificador... /* compilado se o identificador não estiver definido */ #endif Elementos de linguagem C Parte II 8
Compilação condicional Selecção de código alternativo no mesmo ficheiro fonte Controlo de código de debug Eliminação da inclusão múltipla Um ficheiro de inclusão pode incluir outros, úteis ao módulo em causa Um módulo pode incluir explicitamente um ficheiro e incluí-lo de novo, inadvertidamente, por ser invocado noutro A duplicação das definições contidas no ficheiro pode, e deve, ser eliminada com compilação condicional Elementos de linguagem C Parte II 9
Eliminação da inclusão múltipla myfunc.h #ifndef _MYFUNC_H_ #define _MYFUNC_H_ int myfunc(int a, int b); #endif Elementos de linguagem C Parte II 10
Qualificadores auto alojamento automático (por omissão dentro das funções) register variável automática candidata a alojamento em registo extern alojamento externo (quando usado dentro de uma função, aloja a variável como se estivesse fora da função) const objecto semelhante a variável mas com conteúdo constante volatile indica que a variável pode mudar de estado sem intervenção do programa; implica a supressão de optimizações que poderiam causar uso errado static diversos significados consoante o contexto de utilização Elementos de linguagem C Parte II 11
Qualificador Static Declaração privada de objectos num módulo Uma variável externa ou função, por omissão, é pública definida num módulo e utilizável noutros Com o qualificador static torna-se privada só é conhecida dentro do módulo nomes iguais em módulos diferentes, com static são objectos distintos Alojamento de variáveis internas a funções Contraria o alojamento automático A variável é alojada numa posição fixa da memória e permanece activa durante toda a execução do programa Pelas regras de scope, a variável só é conhecida dentro da função Elementos de linguagem C Parte II 12
Variáveis de ambiente Os ambientes de execução suportam a definição de variáveis de ambiente nome=texto Estas variáveis são úteis para configurar o comportamento dos programas Os programas podem aceder a todas as variáveis de ambiente através do ponteiro extern char **environ; Ou obter o texto de uma variável específica com a função getenv() definida no header stdlib.h char *getenv(const char *name); Elementos de linguagem C Parte II 13
Biblioteca normalizada As bibliotecas são colecções de funções compiladas, cujo código é seleccionado pelo linker, de acordo com as referências de utilização, e incluído no executável A biblioteca normalizada contém funções, de carácter utilitário e de interface com o ambiente de execução, especificadas no livro The C Programming Language, Appendix B Para que os programas utilizadores conheçam os protótipos das funções, devem incluir o ficheiro header com a respectiva definição assert.h float.h math.h stdarg.h stdlib.h ctype.h limits.h setjmp.h stddef.h string.h errno.h locale.h signal.h stdio.h time.h Elementos de linguagem C Parte II 14