宏意外重新定义

时间:2012-03-11 03:57:23

标签: macros c-preprocessor

我有以下内容:

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

并且PAD被重新定义,即使它在第一个定义之后等于3。但是,如果我明确地将其定义为3,那么它不会被重新定义。因此我假设我编写表达式的方式存在问题,但我不确定是什么。

1 个答案:

答案 0 :(得分:0)

你想要的是

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

正确? (当然0 <= PAD < 4

然后你可以用这种方式定义PAD

#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的倍数(虽然我没有检查否定的情况......)