2010-03-24 36 views
7

是否有可能定義宏C++宏與內存?

write_foo(A); 
and 
read_foo(); 

使:

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

擴展爲:

code_block_1; 
hello; 
code_block_2; 
hello; 

code_boock_3; 
world; 
code_block_4; 
world; 

謝謝!

+0

可能,使用#pragma push/pop並重新定義一個'DEFINE'。我不知道C/C++,以幫助你更多。 – leppie 2010-03-24 08:15:54

+4

每當有人做一些與宏觀複雜的事情,我得問「爲什麼?」。 – 2010-03-24 08:57:03

回答

4

宏無法重新定義其他宏,但可以手動執行。

#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 

不幸的是,#define + #undef組合不能在我所知道的任何其他結構封裝。

+1

當然,這意味着標題不包含標頭警衛...... – 2010-03-24 14:33:15

+0

但是沒關係,只要它#'undef的READ_FOO。 – 2010-07-23 09:14:34

+0

猜猜看! [有人試過](http://stackoverflow.com/questions/9526096/c-macro-with-memory),它不起作用! – Shahbaz 2012-03-02 00:21:07

4

這是不可能的,因爲宏不應該包含預處理器指令。

2

不是您實際要求,但如果WRITE_FOO是一個定義,你可以得到類似的東西(沒有上下文,我將只重用的名字,即使他們不在的意圖很清楚):

#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

這是像Cog這樣的工具的最佳選擇,它可以解決使用python進行直觀編程的代碼生成問題。這看起來像你的代碼使用它

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