Argumentos de main

Muy a menudo necesitamos especificar valores u opciones a nuestros programas cuando los ejecutamos desde la línea de comandos.

Por ejemplo, si hacemos un programa que copie ficheros, del tipo del "copy" de MS-DOS, necesitaremos especificar el nombre del archivo de origen y el de destino.

Hasta ahora siempre hemos usado la función main sin parámetros, sin embargo, como veremos ahora, se pueden pasar argumentos a nuestros programas a través de los parámetros de la función main.

Para tener acceso a los argumentos de la línea de comandos hay que declararlos en la función main, la manera de hacerlo puede ser una de las siguientes:

int main(int argc, char *argv[]);
int main(int argc, char **argv);

Que como sabemos son equivalentes.

El primer parámetro, "argc" (argument counter), es el número de argumentos que se han especificado en la línea de comandos. El segundo, "argv", (argument values) es un array de cadenas que contiene los argumentos especificados en la línea de comandos.

Por ejemplo, si nuestro programa se llama "programa", y lo ejecutamos con la siguiente línea de comandos:

programa arg1 arg2 arg3 arg4 

argc valdrá 5, ya que el nombre del programa también se cuenta como un argumento.

argv[] contendrá la siguiente lista: "C:\programasc\programa", "arg1", "arg2", "arg3" y "arg4".

Ejemplo:

#include <iostream>
using namespace std;
 
int main(int argc, char **argv) { 
   for(int i = 0; i < argc; i++) 
      cout << argv[i] << " "; 
   cout << endl; 
   return 0;
}

Funciones inline

Cuando usamos el nombre de una función, indicando valores para sus argumentos, dentro de un programa, decimos que llamamos o invocamos a esa función. Esto quiere decir que el procesador guarda la dirección actual, "salta" a la dirección donde comienza el código de la función, la ejecuta, recupera la dirección guardada previamente, y retorna al punto desde el que fue llamada.

Esto es cierto para las funciones que hemos usado hasta ahora, pero hay un tipo especial de funciones que trabajan de otro modo. En lugar de existir una única copia de la función dentro del código, si se declara una función como inline, lo que se hace es insertar el código de la función, en el lugar (y cada vez) que sea llamada.

Sintaxis:

inline <tipo> <nombre_de_funcion>(<lista_de_parámetros>);

Esto tiene la ventaja de que la ejecución es más rápida, pero por contra, el programa generado es más grande. Se debe evitar el uso de funciones inline cuando éstas son de gran tamaño, aunque con funciones pequeñas puede ser recomendable, ya que pueden producir programas más rápidos. Su uso es frecuente cuando las funciones tienen código en ensamblador, ya que en estos casos la optimización es mucho mayor.

En algunos casos, si la función es demasiado larga, el compilador puede decidir no insertar la función, sino simplemente llamarla. El uso de inline no es por lo tanto una obligación para el compilador, sino simplemente una recomendación.

Aparentemente, una función inline se comportará como cualquier otra función. De hecho, es incluso posible obtener un puntero a una función declarada inline.

Nota: inline es exclusivo de C++, y no está disponible en C.

Ejemplos:

#include <iostream>
using namespace std;
 
inline int mayor(int a, int b) {
   if(a > b) return a; 
   return b; 
}
 
int main() {
   cout << "El mayor de 12,32 es " << mayor(12,32) << endl; 
   cout << "El mayor de 6,21 es " << mayor(6,21) << endl; 
   cout << "El mayor de 14,34 es " << mayor(14,34) << endl; 
   
   return 0; 
}

Comentarios de los usuarios (4)

SHEILA
2012-02-11 01:39:58

MUCHAS GRACIAS, ESTA PAGINA ES SENCILLAMENTE SUPER PRACTICA, SOY NUEVA EN LA PROGRAMACION, Y ESTAS EXPLICACIONES SON MUCHO MEJORES QUE LAS QUE ME DAN EN LA U.

MUCHAS GRACIAS

SHEILA

Liz
2014-10-28 21:12:37

Realmente esta página esta muy completa y muy bien explicada, muchas gracias.

Adri
2015-01-03 01:39:38

Haber si lo entiendo:

Entonces, en definitiva, usar inline con una funcion es

algo asi como poner los sufijos UL a un numero cuando

lo asignas a una variable tipo unsigned long. Solo sirve

para que funcione mas rapido,¿No?

Steven R. Davidson
2015-01-03 11:10:56

Hola Adri,

Casi. En primer lugar, es una sugerencia al compilador para poder optimizar las llamadas a tal función; puede o no realizar tal optimización.

En segundo lugar, la forma popular de optimizar la función puede ser sustituyendo el código fuente de la implementación de la función en la misma llamada; o sea, muy parecido al comportamiento de una macro. Sin embargo, sólo podemos afirmar que ignoramos el sistema de invocaciones (o llamadas) a nivel del procesador.

La conclusión es que el programa consistirá de invocaciones optimizadas, durante su ejecución. Usar sufijos para literales es una ayuda al compilador, que posiblemente suponga una compilación más rápida.

Hasta pronto,

Steven