こんにちは、高木です。
これまでに書いて来た「省略記号表記を用いる関数形式マクロに渡された実引数の個数を調べる」や「マクロの可変個実引数の型を強制する」では、複合リテラルを使って何ができるかを模索しています。この手のネタは、ちょっと考えればまだまだ出てきそうです。今回もそのひとつです。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> struct A { int param1, param2, param3; }; #define foo(...) test((struct A[1]){{__VA_ARGS__}}) void test(const struct A *a) { printf(".param1 = %d\n", a->param1); printf(".param2 = %d\n", a->param2); printf(".param3 = %d\n", a->param3); } int main(void) { foo(.param3=3, .param1=1); return 0; } |
ちょっと定義が面倒ですが、複合リテラルをうまくつかえば、名前付きの実引数を実現できることがわかります。しかも、名前付きでなくても、従来通り指定した順で、実引数がどの仮引数に対応するかも決まります。
マクロ定義を伴わないといけませんので、どんなにマクロを駆使しても、この関数定義を簡略化することはできそうにありません。どうしてもやるなら、専用のツールを自作するなどして前処理するしかなさそうです。