Você está na página 1de 14

Elementos de Linguagem C

Parte II

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


2010.04

Você também pode gostar