用于N-D数组赋值的C宏重载

时间:2013-05-22 02:39:14

标签: c macros

关于宏重载已有很多问题/答案。但是,我无法找到将其应用于我的特定问题的方法。

我想在C中方便地为我的3D图像指定值。 现在,我这样做:

#define IMGET(im,y,x,c) im.data[(y)+im.height*((x)+im.width*(c))]
#define IMSET(im,y,x,c,v) IMGET(im,y,x,c)=v

效果很好。

但是,当我有只有2D的黑白图像时,我也想使用它。 像那样的东西:

#define IMGET(im,y,x,c) im.data[(y)+im.height*((x)+im.width*(c))] //3D case
#define IMSET(im,y,x,c,v) IMGET(im,y,x,c)=v //3D case
#define IMGET(im,y,x) im.data[(y)+im.height*(x)] //2D case
#define IMSET(im,y,x,v) IMGET(im,y,x)=v //2D case

有可能吗?

1 个答案:

答案 0 :(得分:0)

@Potatoswatter的评论提供了一个非常好的通用解决方案。但对我的简单问题来说,这可能是一种过度杀伤。

看了之后,我找到了以下解决方案:

#define IMGET(im,y,x,...) im.data[(y)+im.height*((x)+im.width*(__VA_ARGS__+0))]

然后,我可以将此宏用于以下所有情况:

float val = IMGET(im,y,x,c);

或:

float val = IMGET(im,y,x,c);

如果我想要帮助,我会这样做:

IMGET(im,y,x,c)=val;

IMGET(im,y,x)=val;