2012-03-11 33 views
0

我有以下几点:宏意外重新

#define PAD ( 4 - ((WIDTH*BPP)%4) ) 
#if PAD == 4 
#define PAD 0 
#endif 

和PAD进行了重新定义,即使是第一次定义后等于3。但是,如果我明确地将其定义为3,那么它不会被重新定义。因此,我认为我写这个表达方式存在问题,但我不确定是什么。

+1

什么是WIDTH和BPP定义为?如果你从未指定它们,那么它们被预处理器视为零。你怎么知道第一个'#define'后的'PAD'是3?如果你要重新定义它,你需要'#define PAD 0'前面的'#undef PAD'。 – 2012-03-11 04:07:31

+0

我是个白痴! BPP是在PAD之后定义的。谢谢 – linitbuff 2012-03-11 04:10:15

回答

0

你想要的是

(PAD + (WIDTH * BPP)) % 4 == 0 

吧?

然后就可以以这种方式限定PAD(当然0 <= PAD < 4 OF):

#define PAD (3 - ((WIDTH * BPP + 3) % 4)) 

实施例的Python会话:

>>> def f(x): return 3 - (x+3)%4 
... 
>>> [ (x, f(x), x + f(x)) for x in xrange(100,108) ] 
[(100, 0, 100), (101, 3, 104), (102, 2, 104), (103, 1, 104), (104, 0, 104), (105, 3, 108), (106, 2, 108), (107, 1, 108)] 

一般而言,

#define PAD ((N-1) - (X + (N-1)) % N)) 

使得PAD + X的倍数N的约束下0 <= PAD < N(虽然我没有检查负面情况......)