我在尝试表达指向宏中类型的指针时遇到了问题。
举个简单的例子。
#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
的方式感兴趣。
答案 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}}