If en macros ?

Iniciado por ramona98, 20 Agosto 2013, 12:18 PM

0 Miembros y 2 Visitantes están viendo este tema.

ramona98

Es posible incluir un IF en un macro?

Por ejemplo, quiero hacer un macro que devuelva TRUE si el argumento introducido es un digito decimal, y no se me ocurre otra forma que no sea anadiendo un if en el macro.



por otro lado, es posible que un macro devuelva un char o un string en lugar de de int o float?

gracias y saludos

amchacon

Una macro no devuelve nada.

¿Usas C++? Si es así, quizas te interese usar mejor funciones inline con sobrecarga de argumentos:

Código (cpp) [Seleccionar]
inline void Ejemplo(float argumento)
{
  // blablabla...
}

inline void Ejemplo(int argumento)
{
  // blablabla...
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

ramona98

no te entiendo,
mira, esto es exactamente lo que necesito:

Exercise 10-2: Write a macro is_digit that returns TRUE if its argument is a decimal digit.


yo entiendo que una macro te devuelve un output, pero dicho output no puede ser una string? o que forma existe de que me devuelva un TRUE ?

gracias!

ivancea96

TRUE es igual a 1. es un valor Booleano (1 o 0), verdadero o falso, no una string.

ramona98

gracias,

entonces seria algo asi?

is_digit(x) (if(x == 0 || x == 1 ||..... x== 9)
{
// aqui se supone que tengo decir que si esto se cumple se devuelva 0 si no 1, pero  :huh:
}


rir3760

La macros no son funciones, son sustituciones de texto y estas ocurren antes de que el texto sea compilado. Para explicarlo mejor cualquiera que haya utilizado un editor de texto (el que sea) sabe como funciona la opción para remplazar. Por ejemplo uno puede sustituir todas las instancias de la palabra "negro" por "blanco":

Texto original:
int muy_negro;
int negro;

/* ... */

negro++;

/* ... */

if (negro + negro == muy_negro)
   puts("negro, negro entonces muy negro");

/* ... */


Remplazamiento de "negro" por "blanco" resulta en:
int muy_negro;
int blanco;

/* ... */

blanco++;

/* ... */

if (blanco + blanco == muy_negro)
   puts("negro, negro entonces muy negro");

/* ... */

Este ejemplo sigue la convención de C: las sustituciones no se realizan si la palabra completa no coincide y el texto de las cadenas literales se ignora.

En el caso de las macros con argumentos se realiza la sustitución y donde se indique un argumento formal (definición de la macro) este se sustituye por el argumento actual (uso de la macro):
/* a y b son los argumentos formales */
#define SUMA(a, b) ((a) + (b))

/* ... */

int x = 1;
int y = 2;
int z;

/* ... */

/* x y y son los argumentos actuales */
z = SUMA(x, y);


Resulta en:
int x = 1;
int y = 2;
int z;

/* ... */

z = ((x) + (y));


Para darte una idea de lo que te piden si el objetivo fuera crear un macro que verifique si un carácter es alfabético en minúsculas podríamos utilizar:
#define es_minuscula(ch)  ((ch) >= 'a' && (ch) <= 'z')

/* ... */

char letra = 'j';

if (es_minuscula(letra))
   puts("Es minuscula");
else
   puts("No es minuscula");


Ya que antes de que sea compilado ese texto resulta (debido a la macro) en:
/* ... */

char letra = 'j';

if (((letra) >= 'a' && (letra) <= 'z'))
   puts("Es minuscula");
else
   puts("No es minuscula");


La macro que debes desarrollar es similar.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

mr.blood

#6
No se si quieres algo asi...


#include <stdio.h>

#define ISDIGIT(character) character>='0' && character<='9'

int main()
{
char numero='a';
if(ISDIGIT(numero))
puts("Es un numero\n");
return 0;
}


Perfectamente puedes poner un if en un macro, pero por limpieza lo he preferido hacer así.

En realidad cuando yo pongo ISDIGIT el compilador lo reemplaza por character>='0' && character<='9' (character sería un "parámetro") es solo cuestion de dejar el código más limpio.


EDITO:

No había visto el comentario de rir3760, es una muy buena explicación de lo que es una macro.

Sa1uDoS

ramona98

perfecto!! muchas gracias a los dos :D

Desconocia que se pudieran ordenar asi " character>='0' && character<='9' " ... me queda mucho  por aprender aun