在宏内键入的指针,C

ide*_*n42 8 c c-preprocessor

我试图表达宏中的类型指针时遇到了问题.

举个简单的例子吧.

#define INDEX_OF_DATA(data, type, index) \
    ((type *)data)[index]
Run Code Online (Sandbox Code Playgroud)

这有效:

INDEX_OF_DATA(buffer, float, 3);
Run Code Online (Sandbox Code Playgroud)

失败的地方:

INDEX_OF_DATA(buffer, float[2], 3);
Run Code Online (Sandbox Code Playgroud)

因为演员应该是(float(*)[2]).

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


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

dla*_*ask 1

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

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

struct mystruct { float f[2]; };
mystruct* p = &INDEX_OF_DATA(buffer, mystruct, 3);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个解决方案可能会受到结构填充的影响,因此最好检查一下:

static_assert(sizeof(mystruct) == sizeof(float (*)[2]), "padding found");
Run Code Online (Sandbox Code Playgroud)