2010-03-24 18 views
7

Ist es möglich, dass MakrosC++ - Makros mit Speicher?

write_foo(A); 
and 
read_foo(); 

so zu definieren:

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(); 

expandiert in:

code_block_1; 
hello; 
code_block_2; 
hello; 

code_boock_3; 
world; 
code_block_4; 
world; 

?

Danke!

+0

Wahrscheinlich, mit #pragma push/pop und definieren die eine "DEFINE". Ich kenne C/C++ nicht, um Ihnen mehr zu helfen. – leppie

+4

Immer wenn jemand etwas komplexes mit einem MACRO macht, muss ich fragen "warum?". –

Antwort

4

Makros können andere Makros nicht neu definieren, aber Sie können dies manuell tun.

#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 

Leider ist die #define + #undef Kombination kann nicht in einer anderen Struktur eingekapselt werden, die ich bewusst bin.

+1

Natürlich würde das bedeuten, dass der Header keine Header-Wächter enthält ... –

+0

Aber das ist in Ordnung, solange es '# undef's READ_FOO. –

+0

Rate mal was! [Jemand hat das versucht] (http://stackoverflow.com/questions/9526096/c-macro-with-memory) und es funktioniert nicht! – Shahbaz

4

Dies ist nicht möglich, da Makro keine Präprozessordirektiven enthalten sollte.

2

Nicht das, was Sie fragen, tatsächlich für, aber wenn WRITE_FOO eine Definition ist man etwas ähnliches bekommen konnte (ohne Zusammenhang will ich nur die Namen wiederverwenden, auch wenn sie nicht so klar auf der Absicht):

#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

Dies ist der ideale Ort für Tools wie Cog, die das Problem der Code-Generierung von einem intuitiven Programmieransatz mit Python her angehen. Dies ist, was wie Ihr Code mit ihm aussehen würde

/*[[[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;