How to receive unnamed structures as function parameters in C?

不想你离开。 提交于 2019-12-10 22:16:50

问题


Yesterday while going through this question, I found a curious case of passing and receiving unnamed structures as function parameters.

For example, if I have a structure like this,

int main ()
{
    struct {
        int a;
    } var;

    fun(&var);
}

Now, what should the prototype of fun be? And how can I use that structure as a structure(pointer) in the function fun?


回答1:


For alignment reasons, this prototype should work:

void fun(int *x);

And of course:

void fun(void *x);

I don't see an easy way to actually use the structure effectively in the function; perhaps declare it again inside that function and then assign the void * ?

EDIT as requested

6.7.2.1 - 15

A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning.




回答2:


You can also define fun as void fun(void* opaque);. This is however not considered a good practice as declaring the parameter as void* will strip it down of any type information. You will also need to interpret the parameter passed, as you will end up with a pointer to a sequence of bytes. You will have to pass the size of the structure somehow too.

This practice is common in the WIN32 API, where you have a field in the structure that specifies the size of the structure (usually named dwSize or similar). This can also help conveying information about the version of the structure definition.

Another thing to consider here is structure packing, which is compiler- and platform-dependent.



来源:https://stackoverflow.com/questions/10040369/how-to-receive-unnamed-structures-as-function-parameters-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!