Как получить безымянные структуры в качестве параметров функции в 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 или аналогичным). Это также может помочь в передаче информации о версии определения структуры.
Еще одна вещь, которую следует рассмотреть здесь, это структура упаковки, которая зависит от компилятора и платформы.