Как получить безымянные структуры в качестве параметров функции в C?

Вчера при рассмотрении этого вопроса я обнаружил любопытный случай передачи и получения неназванных структур в качестве параметров функции.

Например, если у меня есть такая структура,

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

    fun(&var);
}

Теперь, что должен прототип fun быть? И как я могу использовать эту структуру как структуру (указатель) в функции fun?

2 ответа

Решение

По причинам выравнивания этот прототип должен работать:

void fun(int *x);

И конечно:

void fun(void *x);

Я не вижу простого способа эффективно использовать структуру в функции; возможно, объявить его снова внутри этой функции, а затем назначить void *?

РЕДАКТИРОВАТЬ в соответствии с просьбой

6.7.2.1 - 15

Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный элемент (или, если этот элемент является битовым полем, то на модуль, в котором он находится), и наоборот. Внутри объекта структуры может быть безымянный отступ, но не в его начале.

Вы также можете определить fun как void fun(void* opaque);, Это, однако, не считается хорошей практикой, поскольку объявление параметра как void* лишит его информации любого типа. Вам также нужно будет интерпретировать переданный параметр, так как в итоге вы получите указатель на последовательность байтов. Вы должны будете также передать размер структуры.

Эта практика распространена в WIN32 API, где у вас есть поле в структуре, которое определяет размер структуры (обычно с именем dwSize или аналогичным). Это также может помочь в передаче информации о версии определения структуры.

Еще одна вещь, которую следует рассмотреть здесь, это структура упаковки, которая зависит от компилятора и платформы.

Другие вопросы по тегам