2010-03-24 35 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;