c - 迭代结构成员的宏

标签 c macros bit-fields

我使用位字段结构来访问像素中的每个颜色 channel ,问题是我经常有以相同方式应用于每个 channel 的代码,但因为我不能只迭代结构的成员在 C 中,我最终为每个成员拥有 3 个相同代码的副本,或者更不方便的是必须使用 switch-case 语句。

我想如果我可以使用一个宏,这样我就可以通过提供一个数字来访问一个成员会更优雅,理想情况下是一个可以使 .CHAN(i) 变为 .r、.g 或 .b 的宏,具体取决于关于整数变量 i 是否包含 0、1 或 2。除了我不知道如何制作这样的宏,或者即使这是可能的。

一个细节,但每个成员大约是 12 位,而不是人们可能期望的 8 位,所以我不能只将它变成一个数组或有一个带指针的 union 。 X-Macros 也不会做,因为我经常需要在对另一个 channel 做同样的事情之前对每个 channel 做很多事情,换句话说,用于遍历每个成员的 for 循环可以包含的不仅仅是一行。

编辑:这是一些代码,首先是结构:

typedef struct
{
    uint32_t b:12;
    uint32_t g:12;
    uint32_t r:12;
    uint32_t a:12;
} lrgb_t;

现在我的问题在代码中的示例:

for (ic=0; ic<3; ic++)
{
    for (i=0; i<curvecount; i++)
    {
        curve[i].p0.x = (double) i;
        curve[i].p3.x = (double) i+1.;

        switch (ic)     // this is what I'm trying to eliminate
        {
            case 0:
                curve[i].p0.y = pancol[i].r / 4095.;
                curve[i].p3.y = pancol[i+1].r / 4095.;
                break;
            case 1:
                curve[i].p0.y = pancol[i].g / 4095.;
                curve[i].p3.y = pancol[i+1].g / 4095.;
                break;
            case 2:
                curve[i].p0.y = pancol[i].b / 4095.;
                curve[i].p3.y = pancol[i+1].b / 4095.;
                break;
        }
        // Ideally this would be replaced by something like this, CHAN() being an hypothetical macro
        // curve[i].p0.y = pancol[i].CHAN(ic) / 4095.;
        // curve[i].p3.y = pancol[i+1].CHAN(ic) / 4095.;
    }

    ... // more stuff that ultimately results in a bunch of pixels being written, channel after channel
}

最佳答案

正如评论中所指出的,这并没有真正解决 OP 的问题,因为他的结构中的成员是位域,不会与数组对齐。不过,我会将答案保留在这里,希望它仍然对某些人有用。

我认为 union 是您想要的。 您可以编写您的结构,例如

union
{
   struct
   {
       float r;
       float g;
       float b;
   }rgb;
   float channel[3];
} color;

这样结构将在内存中与 float[3] 位于同一位置,并且您可以有效地访问与结构成员或数组中的元素相同的成员。

您可能需要查找确切的语法,但您明白了。

关于c - 迭代结构成员的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15658916/

相关文章:

C程序,找不到头文件

python - python进程之间的共享内存

以下 C 宏会导致问题吗?

c - 宏扩展中 OpenMP Pragma 的错误替换

rust - 创建具有静态生存期的匿名变量时,最佳实践是什么?

c - 由于简单错误,lex 文件未编译

c - 使用 C 从文件中删除相邻的重复行

c++ - 枚举位域和聚合初始化

c++ - 编译器如何实现位域运算?

c++ - C++20 中的位域初始化,构造为 `|| new int`