2010-02-20 16 views
5

Teniendo en cuenta:C macro argumento de 'almacenamiento'

#define f(x, y) (x+y) 
#define g(x, y) (x*y) 
#define A 1, 2 
#define B 2, 3 

int main() { 
    int a = f(A); 
    int b = g(A); 
    int c = f(B); 
    int d = g(B); 
} 

que no funciona,

cómo puedo hacer que funcione? La idea básica es que tengo una lista de argumentos que quiero pasar a dos macros diferentes, sin repetir la lista de argumentos largos cada vez.

¿Hay alguna manera de hacerlo? [Le invitamos a modificar f & g; incluso puede modificar A & la forma en que llamo las macros. Los únicos requisitos son: 1) la lista arguemnt sólo puede aparecer una vez 2) no puede ser codificado ... de modo que pueda llamar a las macros con argumentos diferentes

Si eres solución no hace bastante trabajo, pero "casi funciona" (para tu definición de casi), me gustaría escucharlo también, quizás pueda hacerlo funcionar.

Gracias!

Editar: f & g debe ser macros. Capturan los nombres de los símbolos y los manipulan.

+0

Si va a modificar los requisitos de su pregunta original, por favor proporcione un ejemplo adecuado que muestre lo que realmente quiere. –

Respuesta

3

EDIT: Una versión no modificada que funciona con A y B

#define f(x, y) (x+y) 
#define g(x, y) (x*y) 
#define A 1, 2 
#define B 2, 3 

#define APPLY2(a, b) a b 
#define APPLY(a, b) APPLY2(a, (b)) 

int main(int argc, char* argv[]) 
{ 
    int x= APPLY(f, A); 
    int y= APPLY(f, B); 
    int z= APPLY(g, A); 
    int d= APPLY(g, B); 

    return 0; 
} 
+0

Esto es ingenioso. Cualquier persona que entienda va a votar esta respuesta. – anon

+0

¿Por qué la indirección adicional? '#define APPLY (a, b) a (b)' funciona igual de bien. –

+0

@Chris, no funciona de esa manera. Olvidé el rason exacto, pero MSVC seguro que se queja al respecto. – MSN

4

Usted puede hacer esto:

static int f(int x, int y) { return (x+y); } 
static int g(int x, int y) { return (x*y); } 
#define A 1, 2 
#define B 2, 3 

Si estaba utilizando un compilador de C que apoyó un inline Directiva no estándar, que podría eliminar la sobrecarga de una llamada a la función. Y si estuviera usando C++,

template<T> T f(T x, T y) { return (x+y); } 
template<T> t g(T x, T y) { return (x*y); } 
#define A 1, 2 
#define B 2, 3 

que funcionaría más o menos lo mismo que su solución macro pretendido C.

Si f y g debe ser macros, no hay ninguna manera con el preprocesador C para pasar múltiples argumentos a las macros sin una coma real que aparece en el sitio de invocación. Para hacer eso, debería agregar un preprocesador de nivel sobre el preprocesador C.

+0

Buena solución. Además, incluso sin la directiva en línea, siempre que utilice la directiva estática sobre las funciones, la optimización de los compiladores probablemente se alinee automáticamente de todos modos. –

+0

"una directiva en línea no estándar". De hecho, si apoyara el estándar, probablemente incluiría algo así de simple.Sabemos que el interlocutor está usando C99, ya que su función principal no tiene declaración de retorno, pero presumiblemente tiene la intención de tener un comportamiento definido ;-) –

0

Tal vez esto es lo que quiere:

#include<iostream> 
using namespace std; 

#define A 1, 2 

template <typename T> 
inline T f(T a, T b) { return a + b; } 

int main() 
{ 
    cout << f(A) << endl; 
    return 0; 
} 
+1

La pregunta es sobre C, ¿no es así? –

4

Si estaba utilizando C99, se puede utilizar el compound initialiser syntax a hacer esto pasando varios argumentos como una sola matriz:

#define f(a) (a[0]+a[1]) 
#define g(a) (a[0]*a[1]) 
#define A ((int[]) {1, 2}) 
#define B ((int[]) {2, 3}) 

soportes del CCG esta sintaxis literal compuesta tanto en el modo C89 como en el modo C++.

+0

Thx para ordenar esto :) – mre