2010-03-24 21 views
7

¿Es posible definir macrosmacros C++ con memoria?

write_foo(A); 
and 
read_foo(); 

de modo que:

WRITE_FOO(hello); 

code_block_1; 

READ_FOO(); 

code_block_2; 

READ_FOO(); 

WRITE_FOO(world); 

code_block_3; 

READ_FOO(); 

code_block_4; 

READ_FOO(); 

se expande en:

code_block_1; 
hello; 
code_block_2; 
hello; 

code_boock_3; 
world; 
code_block_4; 
world; 

?

Gracias!

+0

Probablemente, usando #pragma push/pop y redefiniendo el a 'DEFINE'. No sé C/C++, para ayudarte más. – leppie

+4

Cuando alguien hace algo complejo con un MACRO, tengo que preguntar "¿por qué?". –

Respuesta

4

Las macros no pueden redefinir otras macros, pero puede hacerlo manualmente.

#define FOO hello 

FOO // expands to hello 

#undef FOO 
#define FOO world 

FOO // expands to world 

#undef FOO 
#define FOO blah 

FOO // expands to blah 

Desafortunadamente, la combinación #define + #undef no puede ser encapsulada en cualquier otra estructura que yo sepa.

+1

Por supuesto, eso significaría que el encabezado no contiene protectores de encabezado ... –

+0

Pero eso está bien, siempre que '# undef' s READ_FOO. –

+0

¡Adivina qué! [Alguien probó esto] (http://stackoverflow.com/questions/9526096/c-macro-with-memory) ¡y no funciona! – Shahbaz

4

No es posible porque la macro no debe contener directivas de preprocesador.

2

No es lo que en realidad están pidiendo, pero si WRITE_FOO era una definición que usted podría conseguir algo similar (sin contexto simplemente voy a volver a utilizar los nombres, aunque no son tan claras de la intención):

#define READ_FOO() WRITE_FOO 

#define WRITE_FOO hello 
code...[1] 
READ_FOO(); 
code...[2] 
#define WRITE_ROO world 
code...[3] 
READ_FOO(); 

// will expand to: 
code...[1] 
hello; 
code...[2] 
code...[3] 
world; 
0

este es el punto ideal para herramientas como Cog que abordan el problema de la generación de código desde un enfoque de programación intuitiva usando python. Esto es lo que se vería como el código que lo usa

/*[[[cog 
# definitions ---- 
import cog 
Foo = '' 
def WriteFoo(value): 
    Foo = value 

def ReadFoo(): 
    cog.outl(' %s; ' % Foo) 

# generation --- 
WriteFoo('hello') 
]]]*/ 
//[[[end]]] 

some_code_block; 

/*[[[cog 
ReadFoo() ]]]*/ 
hello; 
//[[[end]]] 

some_other_blocK; 

/*[[[cog 
WriteFoo('world') 
ReadFoo() ]]]*/ 
world; 
//[[[end]]] 


last_block;