Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con preprocesadores

Estas en el tema de Duda con preprocesadores en el foro de C/C++ en Foros del Web. Buenos días. La duda es que quiero concatenar una cadena y un entero, sé que se puede hacer una función para esto de forma fácil, ...
  #1 (permalink)  
Antiguo 21/09/2013, 06:18
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Duda con preprocesadores

Buenos días.

La duda es que quiero concatenar una cadena y un entero, sé que se puede hacer una función para esto de forma fácil, pero quiero intentar con preprocesadores. Realicé esto

Código C:
Ver original
  1. #define SGET(y) "GET /pdf/carpeta-operaciones-cambiarias-" #y

El problema está que quiero hacer la impresión del texto, con

Código C:
Ver original
  1. printf("%s\n", SGET(startwith));

Donde startwith es una variable, pero me devuelve
Código text:
Ver original
  1. GET /pdf/carpeta-operaciones-cambiarias-startwith

y no lo que está adentro de la variable startwith

Espero que me puedan ayudar, muchas gracias.
Saludos.
  #2 (permalink)  
Antiguo 21/09/2013, 16:36
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda con preprocesadores

No se si te ayudaré pero te copio la definicion del operador #

Código C:
Ver original
  1. The # (single number sign) operator converts a parameter of a function-like macro into a character string literal.

Segun entiendo textualiza lo que envias como argumento en vez de los datos que contiene. La prueba está en que si envias un texto con comillas añade la barra para indicar comillas dentro de texto. No se si lo he leido por ahi o lo he soñado pero algo me suena acerca de que no se puede enviar textos en forma de variables a las macros a menos que uses las funciones de tratamiento de texto:

Código C:
Ver original
  1. #define SGET(bff, y) sprintf(bff, "GET /pdf/carpeta-operaciones-cambiarias-%s", y)
  2.  
  3. char bff[256], startwith[] = "test";
  4.  
  5. SGET(bff, startwith);
  6. printf(bff);

Y creo que precisamente esa solucion es la que intentas evitar :)

Saludos
vosk
  #3 (permalink)  
Antiguo 21/09/2013, 22:21
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Duda con preprocesadores

Muchas gracias vosk, efectivamente de esa manera, no puedo realizarlo, en el irc de C, me recomendaron usar ## pera esto, pero aún no entiendo el funcionamiento completo. Aunque es bastante curioso lo que se puede hacer con el.

Mientras tanto, a lo que tanto evité, fue a lo que volví

Código C:
Ver original
  1. #define SGET "GET /pdf/carpeta-operaciones-cambiarias-"
  2. #define EGET ".pdf HTTP/1.1\r\nHost: xx.xx.xxx.xxx:80\r\n\r\n"
  3.  
  4. const char *
  5. header_make (int numm)
  6. {
  7.   static char tmp[255] = {0};
  8.   snprintf(tmp, sizeof tmp, SGET "%i" EGET, numm);
  9.  
  10.   return tmp;
  11. }

Y un static, para que el espacio permanezca y no se borre al terminar la función.

Muchas gracias,
saludos.
  #4 (permalink)  
Antiguo 22/09/2013, 08:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda con preprocesadores

Ok funciona perfecto, pero quiero añadir una observacion: ¿no seria preferible guardar las direcciones de servicio en una estructura para poder cargar la configuracion sin tener que recompilar la aplicacion?

Saludos
vosk
  #5 (permalink)  
Antiguo 24/09/2013, 13:42
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Duda con preprocesadores

Buenas,

No entendí la pregunta, si te refieres a las cabeceras de HTTP, no puedo guardar ya que es un programa de fuerza bruta que va buscando cual de todas esas peticiones arroja un 200, y no sé cual es el máximo, igualmente es un programa propio que solo busca facilitarme un trabajo.

Un saludos
  #6 (permalink)  
Antiguo 24/09/2013, 14:37
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Duda con preprocesadores

No, me refiero a que sucederá si pasado mañana por lo que sea en el servidor te ves obligado a cambiar "carpeta-operaciones-cambiarias-" por "otro-nombre-elquesea", tendras que recompilar el programa para que funcione ok? Y si lo has distribuido esa aplicacion dejará de ser funcional no?

Por eso te comenté lo de cargar la configuracion (el directorio de entrada, el del servicio, tal vez el puerto, etc) en vez de clavarla tal cual.


"...igualmente es un programa propio que solo busca facilitarme un trabajo..."

Ok, lo de arriba lo escribí sin leer esta parte :) No lo vas a distribuir y si es necesario recompilas y ya está, ok en ese caso omite mi comentario porque no tiene sentido.


Saludos
vosk

Etiquetas: int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:13.