Mário Simões Elementos de linguagem C – Parte II 1
2010.04 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)
Mário Simões Elementos de linguagem C – Parte II 2
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 3
2010.04 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;
Mário Simões Elementos de linguagem C – Parte II 4
2010.04 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 */
Mário Simões Elementos de linguagem C – Parte II 5
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 6
2010.04 Programas com módulos main.c myfunc.h #include "myfunc.h" int myfunc(int a, int b); ... int main(void){ myfunc.c ... #include "myfunc.h" x = myfunc(1, 2); ... int myfunc(int a, int b){ return 0; ... } return ...; }
Mário Simões Elementos de linguagem C – Parte II 7
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 8
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 9
2010.04 Eliminação da inclusão múltipla myfunc.h #ifndef _MYFUNC_H_ #define _MYFUNC_H_ int myfunc(int a, int b); #endif
Mário Simões Elementos de linguagem C – Parte II 10
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 11
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 12
2010.04 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);
Mário Simões Elementos de linguagem C – Parte II 13
2010.04 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
Mário Simões Elementos de linguagem C – Parte II 14