在宏内键入的指针,C

时间:2015-06-01 03:52:17

标签: c c-preprocessor

我在尝试表达指向宏中类型的指针时遇到了问题。

举个简单的例子。

#define INDEX_OF_DATA(data, type, index) \
    ((type *)data)[index]

这有效:

INDEX_OF_DATA(buffer, float, 3);

失败的地方:

INDEX_OF_DATA(buffer, float[2], 3);

因为演员表应为(float(*)[2])

有没有办法表达" type" 的指针,...而不使用typeof? (这不是标准C)。

注意,当然还有其他方法可以使这个特定的例子起作用。例如,转换为char并偏移sizeof(type) * index。但我对在C中表达pointer to type的方式感兴趣。

2 个答案:

答案 0 :(得分:3)

使用C类型进行大量复杂的操作可能是一项有趣的运动,但它在实际代码中非常混乱。

为了避免过多地破坏复杂的指针表达式,人们经常使用typedef

如果您typedef期望与您的此宏一起使用的所有类型,您将不会遇到任何问题。观察:

#include <stdlib.h>

#define INDEX_OF_DATA(data, type, index) \
    ((type *)data)[index]


int main(void) {
    float (*buffer)[2] = malloc(4 * sizeof(float[2]));

    typedef float t_f2arr[2];

    INDEX_OF_DATA(buffer, t_f2arr, 3)[0] = 1.1f;

    return 0;
}

这完全符合您的意图!

答案 1 :(得分:0)

如果我们想保留原始宏,我们可以使用这个技巧:

static_assert(sizeof(mystruct) == sizeof(float (*)[2]), "padding found");

不幸的是,这个解决方案可能会受到struct padding的影响,所以最好检查一下:

{{1}}