2016-04-08 34 views
2

所以我的Visual Studio声明tag1和tag2都是未定义的,但它们是cleary定义的,我不能定义基于另一个?C#定义在另一个#define错误

#define push    99 
#define last_instruction push 

#ifdef DEBUG 
    #define new_instr (1+last_instruction) //should be 100 
    #undef last_instruction 
    #define last_instruction new_instr //redifine to 100 if debug 
#endif 

我有一些与tag2的情况,它说定义必须是const,但它是恒定的,它是1 + 99,任何帮助,将不胜感激。

谢谢! BA

+0

请[阅读此](http://stackoverflow.com/help/mcve)。 –

+0

您应该尝试启用“生成预处理文件”选项(/ P)以查看正在进行的操作。 –

+0

也许'__COUNTER__'会帮助你。 – Dani

回答

0

基础上提供的答案我想出了一个解决方案虽然不完美最适合我的情况。

此实现可以通过两种形式来完成:

较少变化在未来(只改变 '最后'):

#define push     99 
#define last     push 

#ifdef DEBUG 
    #define new_instr   (1+last) 
    #define last_instruction new_instr  
#else 
    #define last_instruction last 
#endif 

OR

清除代码,但重复 '推' 中两个地方

#define push     99 

#ifdef DEBUG 
    #define new_instr   (1+push) 
    #define last_instruction new_instr  
#else 
    #define last_instruction push 
#endif 

感谢您的帮助。

4

首先,您不能两次定义相同的宏。如需更换宏,你首先要#undef吧:

#define tag1 99 
#ifdef DEBUG 
    #define tag2 (1+tag1) 
    #undef tag1 
    #define tag1 tag2 
#endif 

但是,这并不能解决问题。宏不是变量,您不能使用它们来存储值以在稍后重新使用。它们是文本替换,因此它们可以并行存在。

因此新定义#define tag1 tag2扩展为1+tag1。但在这一点上,没有什么叫tag1,因为我们只是未定义它,我们还没有重新定义它。

思考这个太多,你将会变成疯狂的:)所以,忘掉了所有的东西,你真正想做的事是这样的:

#define tag1_val 99 
#define tag1  tag1_val 

#ifdef DEBUG 
    #undef tag1 
    #define tag1 (tag1_val+1) 
#endif 
+0

不工作,因为我真的需要tag2 ...电流: 的#define TAG3 99 的#define TAG1 TAG3 的#ifdef DEBUG 的#define tag_help \t \t(1 + TAG1) 的#define TAG2 \t \t \t tag_help 和#undef TAG1 的#define TAG1 \t \t tag_help #endif – Buser

+0

@BrunoMiguel这也行不通,因为我试图解释的原因。现在,如果您需要tag2,只需使用我的代码并添加'#define tag2(tag1_val + 1)' – Lundin

+0

我将编辑该问题以考虑所有变量。因为我真正想要的是tag1基于最后一个标签是动态的...... – Buser

1

如果你要的是整型常量少数符号名称,您可以在一个enum这样定义它们:

enum { 
    push = 99, 
#ifdef DEBUG 
    new_instr, 
#endif 
    last_plus_1, 
    last_instr = last_plus_1 - 1 
}; 

new_instr将是100(如果定义DEBUG),last_plus_1将是要么101(如果定义了DEBUG)或100(如果DEBUG未定义),并且last_instr将小于last_plus_1