関数内構造体
PostgreSQLを読んでいて,こんなコードを見つけた.
関数内で構造体を定義して使用している.
こういった書き方ができることは知っていたけど,具体的に使われているのをみたのは初めてだ.
ここではアライメントの調整の為に利用しているみたい.
static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from, Buffer newbuf, HeapTuple newtup, bool move) { /* * Note: xlhdr is declared to have adequate size and correct alignment for * an xl_heap_header. However the two tids, if present at all, will be * packed in with no wasted space after the xl_heap_header; they aren't * necessarily aligned as implied by this struct declaration. */ struct { xl_heap_header hdr; TransactionId tid1; TransactionId tid2; } xlhdr; /* 略 */ xlhdr.hdr.t_natts = newtup->t_data->t_natts; xlhdr.hdr.t_infomask = newtup->t_data->t_infomask; xlhdr.hdr.t_hoff = newtup->t_data->t_hoff; /* 略 */ /* * As with insert records, we need not store the rdata[2] segment if we * decide to store the whole buffer instead. */ rdata[2].data = (char *) &xlhdr; rdata[2].len = hsize; rdata[2].buffer = newbuf; rdata[2].buffer_std = true; rdata[2].next = &(rdata[3]); /* 略 */ }