COMPONENTES DE C++

3. Componentes de C++







3.1 Directivos
#include <iostream> // una directiva al preprocesador
C++ utiliza un preprocesador, al igual que su predecesor, el lenguaje C. Un preprocesador es un programa que actúa sobre el código fuente antes que el propio compilador. En la sentencia para el preprocesador #include, su acción es simple, remplaza la sentencia por el contenido de los archivos citados en la sentencia #include. El nombre del archivo está encerrado entre los símbolos "<" y ">".
En este caso se ha hecho referencia al archivo iostream. Este archivo posee las definiciones utilizadas por cout para visualizar el mensaje. Sin esta directiva la compilación no hubiera procesado la sentencia cout ni hubiera reconocido los símbolos de los operadores de inserción (<<) ni de extracción (>>). Hay otras sentencias para el preprocesador que se verán más adelante.
Los compiladores C++ traen consigo muchos archivos de encabezados (header files) que brindan soporte a distintas ramas de funcionalidades. En C este tipo de archivos lleva la extensión .h (por header file), pero en C++ no lleva ninguna extensión en particular. En el ejemplo se hace referencia al archivo de encabezado <iostream>, un archivo que brinda soporte a las funciones de entrada y salida.
La versión C de <iostream> es <iostream.h>. Pero en este caso se ha incluido la versión C++, por eso se debe incluir la directiva using namespace.
#include <iostream> // una directiva al preprocesador
using namespace std;
Namespace es una colección de nombres y de identificadores C++. El uso de namespace impide la aparición de conflictos entre bibliotecas que usan un mismo nombre o identificador. Esto significa que la variable cout que se usa en la función y que está definida en <iostream> se llama en realidad std::cout. De esta manera se puede hacer referencia a cout sin tener que codificar siempre el prefijo std.


3.2 Declaraciones globales
Las variables globales se usan de forma frecuente para pasar información entre diferentes secciones del código que no comparten una relación de "función llamadora" - "función llamada", como ocurre con hilos concurrentes y módulos para el manejo de señales. Los lenguajes de programación donde cada archivo define un espacio de nombres implícito eliminan la mayor parte de los problemas de los lenguajes con nombres de espacios globales, aunque pueda haber algunos problemas si no se tiene cuidado a la hora de encapsular el código. Sin las restricciones adecuadas (como por ejemplo con un mutex), el código que usa variables globales no será a prueba de hilos excepto para los valores de sólo lectura en la memoria protegida.
Ejemplo de una variable global en C++:
#include <iostream>

int global = 3; // Esta es la variable global.

void ChangeGlobal()
{
   global = 5; // Se referencia la variable global en una función.
}

int main()
{
   std::cout << global << '\n'; // Se referencia la variable global en una segunda función.
   ChangeGlobal();
   std::cout << global << '\n';
   return 0;
}
Dado que la variable es de ámbito global, no hay necesidad de pasarla como parámetro a otras funciones. La variable global pertenece a todas las funciones del programa.
El resultado será:
3
5
El uso de variables globales dificulta la legibilidad del código fuente. Dado que en cualquier parte del programa y en todo momento se puede cambiar el valor de la variable, para entender el uso de la variable suele ser necesario tener que comprender el funcionamiento de una parte amplia del programa. También dificultan la separación del código en bibliotecas, ya que muchos sistemas (como por ejemplo DLL) no soportan la visualización directa de variables globales en otros módulos. La denominación de las variables también puede desembocar en problemas con la denominación ya que una variable global corre el riesgo de ser usada, por ejemplo, en lugar de una variable local. Una variable local con el mismo nombre puede ocultar el acceso de la variable global, dificultando aún más la legibilidad del código. Por todo ello, el uso de variables globales puede provocar efectos secundarios difíciles de entender, predecir, y hacen la búsqueda de errores más compleja. Las variables globales también dificultan someter las diferentes unidades de software a tests de forma aislada, repercutiendo así en una posible reducción de la calidad del código.


3.3 Funciones main
Todo programa C++ tiene una función main( ) que es el punto inicial de entrada al programa. Su estructura es:
main( )
{

… bloque de estatutos
}


·         Los estatutos incluidos entre las llaves {…} se denominan bloque.
·         Un programa debe tener sólo una función main( ). Si se intenta hacer dos funciones main ( ) se produce un error.
·         Además de la función main( ), un programa en C++, consta de una colección de funciones.
COMENTARIOS

Los comentarios son mensajes que el programador escribe dentro del código, pero que el compilador no los detecta. Se usan para documentar los programas de acuerdo a las necesidades del programador. Existen dos formas de escribir comentarios

·         // (Doble slash) este par de caracteres genera un comentario de una línea después de su aparición. Ejemplo:
 int x=100; // declaración de la variable x inicializada en 100
·         /* */(Slash asterisco asterisco slash) Este comentario puede abarcar varias líneas de código. Todo lo que se encuentre en medio de estas parejas de caracteres es un comentario.
ejemplo:
/* Programa ejemplo1
Desarrollado por: Samuel Padilla
Fecha: Agosto 10 de 2010 */



Ejemplo1: PROGRAMA QUE IMPRIME UNA CADENA DE TEXTO CONSTANTE (para dev C++)

#include “iostream” //libreria o biblioteca
using namespace std;
int main( ){//en dev C++ no se usa void main
cout<<“primer programa en C++”<<endl;
system(“pause”);
}

·         La primera línea de código es una directiva y se usa para llamar un archivo llamado iostream que contiene la función que nos permite imprimir en la pantalla (leer en este blog la entrada DIRECTIVAS)
·         El programa es básico, utiliza la función cout que esta en la librería iostream para imprimir en la pantalla lo que el usuario ubique dentro de las comillas.
·         Todos los programas que desarrollemos en esta primera parte del curso tendrán una estructura similar. La diferencia estará en la parte encerrada entre corchetes { } es decir el bloque de código
ejemplo 2: PROGRAMA CON VARIABLES DE TIPOS DE DATO SIMPLE INICIALIZADAS (para dev C++)

#include “iostream”
using namespace std;
int main(){
int x=1200;
float nota=4.9;
double largo=0.0000000001;
char miletra=’R’;
string c=”AMO la programacion de computadoras”;
cout<<“La variable entera fue iniciada en “<<x<<endl;
cout<<“La variable flotante fue iniciada en “<<nota<<endl;
cout<<“La variable doble precision fue iniciada en “<<largo<<endl;
cout<<“La variable caracter fue iniciada en “<<miletra<<endl;
cout<<“La variable cadena (string) fue iniciada en “<<c<<endl;
system(“pause”);
}

 En el código anterior se declara una variable de cada tipo, se inicializa y se imprime.



3.4 Funciones definidas por el usuario


Procedimiento
Para utilizar el archivo de configuración a fin de crear el programa de función definida por el usuario udfsrv, a partir del archivo fuente udfsrv.c, siga estos pasos:
  1. Asigne a la variable de entorno UDF el nombre del programa, de este modo:
    • En el shell bash o Korn:
         export UDF=udfsrv 
    • En el shell C:
         setenv UDF udfsrv 
  2. Si su directorio de trabajo contiene un archivo udf.ics, resultante de la creación de un programa diferente con el archivo udf.icc, suprima el archivo udf.icsmediante este mandato:
       rm udf.ics 
    Si para el mismo programa que ahora creará de nuevo ya existe un archivo udf.ics, no es necesario suprimir el archivo.
  3. Compile el programa de ejemplo, especificando:
       vacbld udf.icc 
    Nota
    El mandato vacbld está incluido en VisualAge C++.
La biblioteca de UDF se copia en el directorio sqllib/function del servidor.
Si es necesario, establezca la modalidad de archivo para la función definida por el usuario a fin de que la instancia de DB2 pueda ejecutar la función.
Una vez creado el programa udfsrv, puede crear la aplicación cliente, udfcli, que llama al programa. El programa se proporciona en versiones para CLI de DB2 y para SQL incorporado.
Puede crear el programa udfcli de la CLI de DB2, a partir del archivo fuente udfcli.c, contenido en sqllib/samples/cli, utilizando el archivo de configuracióncli.icc.
Puede crear el programa udfcli de SQL incorporado, a partir del archivo fuente udfcli.sqc, contenido en sqllib/samples/c, utilizando el archivo de configuraciónemb.icc.
Para invocar la UDF, ejecute la aplicación solicitante de ejemplo entrando el nombre del ejecutable:
   udfcli 
La aplicación solicitante llama a la función ScalarUDF de la biblioteca udfsrv.

Comentarios