Title: Introducci
1Introducción al lenguaje Ada95
2Historia
- Concurso de ideas del Departamento de Defensa
norteamericano (1974) - Primer estándar Ada 83
- Utilizado en la industria militar, aeroespacial,
sistemas empotrados, etc. - Ada influye en lenguajes posteriores (c,
ObjectPascal, etc.)
3Historia(2)
- Segundo estándar Ada 95
- Actualiza el lenguaje orientación a objetos,
monitores (objetos protegidos), anexos
especializados ... - La aparición de Linux provoca una expansión de
Ada como lenguaje de uso general compilador
gratuito GNAT
4Elementos del lenguaje
- Tipos de datos
- Estructuras algorítmicas
- Subprogramas
- Excepciones
- Paquetes
- Genéricos
- Concurrencia
- Orientación a objetos
- Biblioteca estándar
- Anexos especializados
5Objetivos principales
- Legibilidad
- Facilitar lectura. Evitar notación concisa
- Tipado fuerte
- Impedir confusión entre conceptos lógicamente
distintos. - Construcción de grandes programas
- Mecanismos de encapsulado para compilación
separada
6Objetivos principales (2)
- Manejo de excepciones
- Control de los errores
- Abstracción de datos
- Mayor transportabilidad y mejor mantenibilidad
- Procesamiento paralelo
- Mecanismos para permitir ejecutar actividades
(tareas) de forma paralela - Unidades genéricas
- Especialmente útil para la creación de bibliotecas
7Un programa en Ada
- Programa pral. Servicios de otras unidades de
biblioteca
--Ejemplo de programa with Text_IO --cláusula de
contexto procedure hola is --procedimiento
principal --Parte de declaraciones begin
--Cuerpo de sentencias ejecutables
Text_IO.Put_Line(Hola, mundo) end hola
8Un programa en Ada (2)
-- ejemplo de programa with Text_IO use
Text_IO procedure hola is saludo STRING
(hola, mundo) begin for i in 1..10 loop
Put_Line(SALUDO) end loop end hola
9Algunos detalles
- No distingue mayúsculas de minúsculas
- Se pueden usar acentos y eñes en los
identificadores - Comprobación muy estricta de tipos
- Las sentencias siempre terminan en punto y coma
10Elementos léxicos
- Comentarios con doble guión -- texto
- Identificadores tipo Pascal
- Cadenas entre comillas dobles
- Caracteres con comilla simple
- Números (literales numéricos)
- Enteros
- Reales
11Elementos léxicos
- Más sobre literales numéricos
- Se pueden emplear separadores
- 123_456_789
- Literales enteros y reales con exponente
- 9.84E2 19E2
- Se puede expresar la base
- 21001001
- Un literal con base también puede tener
exponente) - 1240E3 (es 4 x 12 x 123)
12Tipos de Datos
Elementales
Compuestos
Arrays
Records
Tagged records
Tasks
Protected objects
Accesos
Escalares
Discretos
Reales
Tipos Numéricos
Enumeración
Coma Fija
Coma flotante
Enteros
Enteros con signo
Ordinarios
Decimales
Modulares
13Variables y asignaciones
x INTEGER --una variable de tipo integer
llamada x x, y, z INTEGER
x, y, z INTEGER 0
14Declaración de constantes
- variable pero poniendo la palabra reservada
constant - En el caso de constantes numéricas se puede
omitir el tipo (declaración de número)
c constant INTEGER 10 --Declaración de
la --constante c pi
constant 3.1416 --Declaración del número pi
15Declaración de tipos
- type nombre is definición
- type nombre is new definición
- subtype nombre is definición
type byte is range 0..255 subtype byte is
INTEGER range 0..255 type Mienterocorto is new
INTEGER range 0..255
16Tipos predefinidos
- Un tipo está caracterizado por un conjunto de
valores y un conjunto de operaciones - Paquete STANDAR
17Tipos enteros
- integer
- natural (de 0 en adelante)
- positive (de 1 en adelante)
- mod N (entero sin signo, rango 0..N)
- Se puede imponer una restricción al tipo integer
(range)
p INTEGER range 1..10 x INTEGER range
1..IJ t mod 10 --Entero rango 0..9
18Tipos enteros (2)
- Algunas implementaciones
- long_integer
- short_integer
- OJO, el rango de valores de estos tipos depende
de la implementación - Como hacer programas más transportables ?
- Atributos
- Son valores asociados a tipos u objetos que
suelen usarse para devolver propiedades de un
tipo de datos o efectuar operaciones predefinidas
sobre un tipo
19Tipos enteros (3)
- Atributos tipoatributo(params)
- Por ejemplo
subtype NATURAL is INTEGER range
0..INTEGERLAST subtype POSITIVE is INTEGER
range 1..INTEGERLAST
20Tipos enumerados
type COLOR is (Rojo, Ambar, Verde) type DIA is
(lun, mar, mie, jue, vie, sap, dom) subtype
LABORABLE is DIA range lun..vie
--Restricciones --Hay un tipo enumeración
predefinido, el CHARACTER type CHARACTER is
(nul,...,A,B,...,del)
21Atributos típicos
- Atributos aplicables a todos los tipos escalares
(enteros y enumerados)
- TFirst
- TLast
- TRange
- TLength
- TSucc(e)
- TPred(e)
- TMax(e1,e2)
- TMin(e1,e2)
- TPos(e)
- TVal(e)
- TValue(string)
- TImage(e)
22Ejemplos de atributos
type DIAS is (lun, mar, mie, jue, vie, sap,
dom) subtype LABORABLE is DIAS range lun..vie
--Restricciones for dia in lun..sap loop
Text_IO.Put(DIASIMAGE(dia)) end loop hoy
lunes mañana DIASSUCC(hoy) ayer
DIASPRED(hoy) -- error if hoyltmañana then
Text_IO.Put(Hoy es menor que mañana) end
if
23Ejemplos de atributos (2)
x INTEGER begin Text_IO.Get (cadena) x
INTEGERVALUE (cadena) Text_IO.Put
(INTEGERIMAGE(x)) end
24Tipo booleano
- El tipo booleano es un tipo enumerado predefinido
cuya declaración puede entenderse como
type BOOLEAN is (FALSE,TRUE)
25Tipos reales
- Tipo predefinido FLOAT
- Algunas implementaciones
- Short_Float
- Long_Float
- El programador también puede definir sus propios
reales - Coma fija
- Coma flotante
26Coma fija y coma flotante
--Coma flotante type rflotante is digits 5
range 1.0..1.0 --se exigen una precisión de
al menos 5 digitos --significativos --Coma
fija ordinario type rfija1 is delta 0.01 range
1.0..1.0 --Se especifica un error absoluto
(0.01) --Coma fija decimal type rfija2 is delta
0.01 digits 5
27Conversión de tipos
- Ada gt Tipado fuerte
- No permite nunca mezclar tipos diferentes
- Conversión
- Nuevo_Tipo(Expresión_Tipo_Original)
28Operadores
- Los típicos y además
- exponenciación ab
- modulo a mod b
- resto a rem b
- valor absoluto abs a
- Comprobaciones de pertenencia aplicables a todos
los tipos escalares - in, not in (aunque técnicamente no son
operadores)
29Arrays
- Nombre_Array array (tipo_discreto) of
Tipo_Elemento
A array (INTEGER range 1..6) of REAL AA
array (INTEGER range 0..2, INTEGER range 0..3) of
REAL N INTEGER 5 B array (INTEGER range
1..N) of BOOLEAN HORAS_TRABAJADAS array (DIA)
of REAL
30Arrays (2)
- Recordando atributos
- AAFIRST(1) es 0
- AAFIRST(2) es 0
- AALAST(1) es 2
- AALAST(2) es 3
- AALENGTH(1) es 3
- AALENGHT(2) es 4
- AARANGE(1) es 0..2
- AARANGE(2) es 0..3
31Inicialización de arrays
- Agregados (forma literal de un valor formación)
- (0.0, 0.0, 0.0)
- Un agregado debe ser completo
- Se puede declarar una formación como constante en
cuyo caso el valor inicial es, evidentemente,
obligatorio
32Inicialización de arrays (2)
A array (1..6) of REAL (0.0, 0.0, 0.0, 0.0,
0.0, 0.0) AA array (0..2,0..3) of REAL
((0.0, 0.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 0.0)) MAÑANA
constant array (DIA) of DIA (mar, mie,
jue, vie, sap, dom, lun)
33Tipos arrays
- type Nombre is array (tipo_discreto) of
Tipo_Elemento - Además en Ada se introduce el concepto de array
irrestringido (no se dan las restricciones de los
índices)
type VECTOR is array (1..6) of REAL type VECTOR
is array (INTEGER range ltgt) of REAL VVECTOR(1..5
) type MATRIZ is array (INTEGER range ltgt,
INTEGER range ltgt) of REAL --Los límites
pueden ser cualquier expresión y se
evalúa --cuando se encuentra la restricción del
índice M MATRIZ(1..N,1..N)
34Tipos arrays (2)
- Otra forma dar los limites arrays contantes
- Los límites se deducen a partir del valor inicial
(el límite infierior sería SFIRST siendo S el
subtipo del índice)
type L is array (DIAS range ltgt) of
DIAS SIGUIENTE_DIA_LABORABLE constant L
(mar, mie, jue, vie, lun) --OJO !!! type
MATRIZ is array (INTEGER range ltgt, INTEGER range
ltgt) of REAL MIMATRIZ constant MATRIZ
((1.0, 0.0), (0.0, 1.0))
35Agregado por nombre
- Agregados por posición
- (0.0, 0.0, 0.0)
- Agregados por nombre (no importa el orden)
- (1gt0.0, 2gt0.0, 3gt0.0)
type MATRIZ is array (INTEGER range ltgt, INTEGER
range ltgt) of REAL MIMATRIZ constant MATRIZ
(1gt(1gt1.0, 2gt0.0),
2gt(1gt1.0, 2gt0.0)) DIA_TRABAJO constant
array(DIA) of BOOLEAN (lu..viegtTRUE,
sabdomgtfalse)
36Más detalles sobre agregados
- Uso de others (última opción)
- No se puede mezclar en un mismo agregado notación
por nombre y por posición (ojo si en el caso de
los distintos niveles en un agregado
multidimensional)
MIMATRIZ constant array(1..5,1..2) of REAL
(1gt(1gt1.0,
2gt0.0),
2gt(1.0, 0.0),
othersgt(othersgt0.0)))
37Más sobre arrays
- Asignación
- Igual tipo y el mismo número de elementos
- Igualdad y desigualdad (igual tipo)
- número de componentes y además componentes
iguales
VVECTOR(1..5) WVECTOR(0..4) ... VW --V y
W son del mismo tipo y ambos tienen 5 comp.
38Más sobre arrays (2)
- Se puede hacer referencia a un trozo de un array
monodimensional gt rodajas
VVECTOR(1..5) WVECTOR(0..4) V(1..2)
W(3..5)
39Más sobre arrays (3)
- Operaciones sobre arrays de una dimensión
- and, or, xor, not gt arrays booleanos
- , / (ya vimos la regla),
- gt, gt, gt, gt (orden lexicográfico)
- Operadores binarios gt mismo tipo y mismo número
de componentes - Nuevo operador (concatenación de formaciones
de una dimensión)
40Strings
- Es un array de caracteres
- type STRING is array (POSITIVE range ltgt) of
CHARACTER
S STRING(1..7) G constant STRING
(H,O,L,A) --Notación alternativa y más
cómoda G constant STRING hola
41Registros
type FECHA is record DIA INTEGER range
1..31 MES NOMBRE_MES --lo suponemos
definido AÑO INTEGER end
record FFECHA F.DIA4 GFECHA(4,JUL,1776)
H (MESgtJUL,DIAgt4,AÑOgt1976)
42Estructuras algorítmicas
- Sentencias simples
- Bloque begin..end
- Sentencias condicionales if, case
- Sentencias iterativas for, while, loop
- Subprogramas function, procedure
43Sentencias simples
- Asignación var expr
- Sentencia nula null
- Llamada a procedimiento
- proc(parm1,parm2,...)
44Bloque begin..end
nombre_de_bloque declare iINTEGER0
--las declaraciones van aquí begin ii1
--Las sentencias van aquí exception
--manejo de exepciones end nombre_de_bloque
45Ambito
declare iINTEGER0 begin ...
declare kINTEGERi iINTEGER0
begin ... end ... end
ámbito de la I externa
visibilidad de la I externa
ámbito de la I externa
ámbito de la I externa
46Ambito (2)
externo declare IINTEGER0 begin
... declare KINTEGERI
IINTEGER JINTEGERexterno.I --nos
referimos a la I externa begin ...
end ... end
47Sentencias condicionales
if expr then sentencia elsif
sentencia elsif sentencia ... else
sentencia end if
- case expr is
- when caso gt
- sentencias
- ...
- when others gt sent
- end case
- expr sólo tipos discretos
- caso valor, rango, o lista de valores
v1v2v3... - Todos los casos han de estar contemplados
48Sentencias iterativas
while expr loop sentencia end loop for ident
in reverse rango loop sentencia end
loop loop sentencia end loop
49Ejemplos de for
for i in 1..10 loop put(hola,
i)put(i)new_line end loop for i in reverse
1..10 for i in lunes..viernes for i in dias
range lunes..miercoles for i in
diasfirst..diaslast for i in laborables
50Exit y goto
loop if una_condición then exit end
if -- o también exit when
otra_condición end loop if condición then
goto Pabajo end if ... ltltPabajogtgt Put (Código
después de la etiqueta)
51Subprogramas
- Procedimientos
- modo del parámetro in, out o in out
- paso de parámetros por posición o por nombre
- parámetros por omisión (default)
- Funciones
- los parámetros siempre son in (no se pueden
modificar) - Se permite sobrecarga, recursividad y anidamiento
52Procedimientos
- Modo de acceso a los parámetros
- in el parámetro funciona como una constante
- out el parámetro funciona como una variable sin
inicializar - in out el parámetro funciona como una variable
inicializada
procedure nombre (decl1decl2...) is
declaraciones locales (variables, tipos,
subtipos, procedimientos,...) begin cuerpo del
procedimiento end nombre
53Funciones
- Sólo admite parámetros in
function nombre (params) return tipo is
declaraciones locales (variables, tipos,
subtipos, procedimientos,...) begin cuerpo de
la función end nombre
54Declaraciones, ámbito y visibilidad
procedure F(...) procedure G(...) is begin
F(...) end G procedure F(...) is begin
G(...) end F
procedure P is IINTEGER0 procedure Q
is kINTEGERI IINTEGER
JINTEGER begin ... end Q begin
... Q(...) end P
55Estructura general de un programa en Ada
- Programa Ada unidades distribuidas en uno o
varios ficheros. - Unidades
- Subprogramas
- Paquetes
- Tareas
- Objetos protegidos
56Paquetes
- En general un programa Ada se compone de un
conjunto de paquetes y un programa principal - La cláusula de contexto with sirve para declarar
que se se van a usar los servicios de un paquete - Paquete
- Especificación (.ads)
- Implemetación(.adb)
57Formato general de un paquete
package nombre_paquete is parte visible
declaraciones (variables, tipos, subtipos,
procedimientos,...) private declaraciones
privadas end nombre_paquete
package body nombre_paquete is más
declaraciones y desarrollo del paquete begin
secuencia de sentencias end nombre_paquete
58Más sobre paquetes
- Los entes declarados dentro del paquete tienen el
mismo tiempo de vida que el paquete en sí - Los paquetes se pueden declarar en cualquier
parte declarativa, es decir, en un bloque,
subprograma o en otro paquete - Acceso a los elementos de un paquete Cláusula
use o bien notación . - Un paquete puede consistir sólo en una
especificación
59Tipos private y limited private
- Al poner un tipo como private su definición
queda oculta - El usuario del paquete sólo podrá utilizar con él
las operaciones declaradas en la parte pública
del paquete, además de , y / - Si se pone como limited private entonces se
deshabilitan también , y /
60Ejemplo
package Manejo_De_Claves is type Clave is
private Clavenula constant Clave
procedure Tomar_Clave(C out Clave) function
"lt"(X, Y in Clave) return Boolean private
Max constant 2 16 - l type Clave is
range 0 .. Max Clavenula constant Clave
0 end Manejo_De_Claves
61Ejemplo (2)
package body Manejo_De_Claves is procedure
Tomar_Clave(C out Clave) is begin
Cuerpo del procedimiento end Tomar_Clave
function "lt"(X, Y in Clave) return Boolean is
begin Cuerpo del operador end "lt" end
Manejo_De_Claves
62Renombrado
- Se puede aplicar a variables, constantes,
excepciones, subprogramas y paquetes
procedure TomaClave(Cout Clave)
renames Manejo_de_Claves.Tomar_Clave functio
n (X,YVECTOR) return REAL renames ESCALAR
function DIEZ return CIFRA_ROMANA renames
X package P renames PILA
63Unidades genéricas
- Unidades con parámetros que se pueden concretar
para diferentes instancias de la unidad
generic type TElemento is private procedure
Algo(Elementoin TElemento) is
Declaraciones begin Acciones end Algo
64Unidades genéricas (2)
- Para utilizar el procedimiento Algo primero se
deberán crear instancias para los tipos
apropiados
... procedure Algo_Entero is new
Algo(integer) procedure Algo_Carácter is new
Algo(character) ... Algo_Entero(30) Algo_Carácte
r(a) ...
65Paquetes genéricos (PG)
- Los paquetes genéricos son los que soportan la
genericidad de los tipos abstractos de datos en
este lenguaje
66Formato general de un PG
generic zona de declaración de parámetros
formales package nombre_paquete_generico is
zona de uso de los parámetros formales end
nombre_paquete_generico
package body nombre_paquete_generico is
desarrollo del paquete end nombre_paquete_generico
67Formato general de un PG (2)
- La forma de usar un paquete genérico es crear una
instancia del PG en la que se especifiquen todos
los parámetros formales requeridos
package nombre_instancia is new nombre_paquete
generico (parametros actuales, ...)
68Ejemplo
generic MAXPOSITIVE type ITEM is
private package PILA is procedure
PONER(XITEM) function QUITAR return
ITEM end PILA
package body PILA is P array (1..MAX) of
ITEM CIMA INTEGER range 0..MAX --cuerpo
de PONER y QUITAR begin CIMA0 end PILA
69Ejemplo (2)
... declare package MI_PILA is new
PILA(100,REAL) use MI_PILA begin ...
PONER(X) ... YQUITAR ... end
70Parámetros formales en PG
- Los parámetros formales pueden ser objetos,
tipos, subprogramas o paquetes - Los parámetros de un PG pueden tener un valor por
defecto - Se declaran de distinta forma según su naturaleza
71Manejo de Excepciones
- En Ada, cuando se producen errores durante la
ejecución de un programa se elevará una excepción
72Excepciones predefinidas
- CONSTRAINT_ERROR
- Generalmente algo fuera de rango
- NUMERIC_ERROR
- Errores numéricos (p.ej. división por 0)
- PROGRAM_ERROR
- Errores estructura de control (p.ej. se llega al
end de una función, se llama a un programa cuyo
cuerpo no se ha definido,..)
73Excepciones predefinidas (2)
- STORAGE_ERROR
- Falta de espacio de memoria
- TASKING_ERROR
- Errores relacionados con tareas
74Ejemplo
begin --secuencia de sentencias exception
when NUMERIC_ERRORCONSTRAINT_ERROR gt
Put(Numeric o constraint error) ...
when STORAGE_ERROR gt Put(Falta de
memoria) ... when others gt
Put(Se produjo otro tipo de error)
... end
75 Dónde se tratan ?
- Los manejadores de excepciones pueden aparecer al
final de - un bloque
- un cuerpo de subprograma
- un cuerpo de paquete o
- un cuerpo de tarea
- No puede devolverse nunca el control a la unidad
donde se elevó la excepción
76Propagación de excepciones
- Si una unidad no proporciona un manejador para
una determinada excepción, ésta se propaga
dinámicamente - Se termina la ejecución de la unidad
- La excepción se eleva al punto donde se invocó a
dicha unidad y así sucesivamente - Por tanto, las excepciones se propagan
dinámicamente y no estáticamente
77Excepciones definidas por el Programador
- Es posible lanzar una excepción
- raise EXCEPCION
- Sintaxis de declaración de excepciones
- Miexcepción exception
- Las reglas de manejo y propagación son idénticas
a las excepciones predefinidas
78Más sobre excepciones
- Las acciones llevadas a cabo por el manejador
pueden tener que realizarse en varias capas - A veces es conveniente manejar una excepción y
luego propagar esa misma excepción (raise)
79Ámbito de las excepciones
- Las excepciones siguen las mismas reglas de
ámbito que otras entidades - Una excepción puede propagarse fuera de su
ámbito, aunque a partir de ahí solo puede
manejarse anónimamente mediante others
80Ámbito de las excepciones (2)
- Una excepción elevada en una declaración se
propaga un nivel hacia fuera - Si un subprograma termina debido a una excepción,
no podemos suponer nada sobre los parámetros
reales out o in out
81Punteros (access types)
- Dos clases de punteros
- punteros para memoria dinámica
- punteros generales
- Los punteros (access), por defecto, sólo sirven
para trabajar con memoria dinámica - Si se quiere trabajar con punteros a objetos
estáticos, hay que usar punteros generales
(access all) - Para poder tomar la dirección de un objeto, éste
debe haber sido declarado expresamente como
aliased.
82Punteros de memoria dinámica
type cosa is record c1,c2integer
end record type ptr_cosa is access cosa -- tipo
puntero ptr ptr_cosa c cosa ptr new
cosa(20,30) -- creación dinámica ptr.c1
15 -- acceso a un campo ptr.all c --
acceso a todo el objeto
83Punteros generales
type cosa is record c1,c2integer
end record type ptr_cosa is access all cosa ptr
ptr_cosa cosa1 aliased cosa cosa2
cosa ptr new cosa(20,30) ptr
cosa1access -- correcto ptr cosa2access --
ERROR ptr cosa2Unchecked_access -- correcto
84Borrado de memoria dinámica
- El lenguaje Ada permite recolección de basura
(pero ningún compilador la soporta) - Borrado explícito con Ada.Unchecked_Deallocation
- with Ada.Unchecked_Deallocation
- ...
- procedure Free is new Ada.Unchecked_Deallocation(c
osa,ptr_cosa) - ...
- Free(ptr)
85Parámetros access
- Un parámetro de un procedimiento puede ser in,
out o access. - En este último caso, el parámetro se comporta
como un tipo puntero
- procedure P (Xaccess Cosa)
- ...
- c aliased cosa
- P(caccess)
86Un apunte más sobre punteros
- Se puede imponer una restricción de lectura a un
puntero de forma que no pueda modificar el objeto
al que apunta
type Punt_Const_Int is access constant
integer ptr Punt_Const_Int i aliased
integer ptriaccess ptr.all3 --error, no se
puede modificar i a --través de ptr
87Entrada / Salida
- Funciones básicas
- get(X), put(X) siendo X de tipo character,
string, integer, float, enumeration - get_line(S,L), put_line(s), siendo S de tipo
string y L la longitud leida - new_line, skip_line
- Para realizar E/S de ristras o caracteres basta
incluir la cláusula de contexto with TEXT_IO
88Entrada / Salida (2)
- Para realizar E/S de los tipos escalares es
necesario crear una instancia del paquete para
este tipo - En cualquier caso hay que utilizar la cláusula
with TEXT_IO, puesto que estos paquetes se
encuentran en dicha librería
package Día_IO is new Enumeration_IO(Dia) package
Mientero_IO is new Integer_IO(Mientero) package
rf_IO is new Float_IO(rf) package rfija1_IO is
new Fixed_IO(rfija1) package rfija2_IO is new
Decimal_IO(rfija1) package Natural_IO is new
Modular_IO(rfija1)
89Más sobre cadenas
- Ada ofrece tres tipos posibles de ristras de
caracteres - Ristras de tamaño fijo (ya hemos hablado de
ellas strings) - with Ada.Strings.Fixed
- Ristras de tamaño limitado
- with Ada.Strings.Bounded
- Ristras de tamaño dinámico
- with Ada.Strings.Unbounded
90Ficheros
- Ficheros de texto
- with Text_IO
- Ficheros uniformes
- Ficheros secuenciales
- with Sequential_IO
- Ficheros de acceso directo
- with Direct_IO
- Existe un cuarto paquete que contiene las
declaraciones de las excepciones usadas en estos
tres paquetes (IO_EXCEPTIONS)
91Funciones numéricas
- Paquete Ada.Numerics
- Funciones matemáticas elementales (sqrt, log,
sin, cos,...) - Ada.Numerics.Generic_Elementary_Functions
- Números aleatorios
- Discretos
- Ada.Numerics.Discrete_Random
- Coma flotante
- Ada.Numerics.Float_Random
92Pragmas
- Algunas veces es necesario hacer una
observación al margen al compilador - pragma nombre(params)
- En general, se pueden colocar en cualquier punto
donde pueda haber declaraciones o sentencias
(aunque algunos pragmas pueden tener
restricciones en este sentido) - Algunos pragmas
- Inline, Interface, Optimize, Priority, ...