C99には複合リテラルがあり、次のように関数に渡すことができます。
f((int[2]){ 1, 2 });
ただし、f
が関数ではなく関数のようなマクロである場合、プリプロセッサが1つの引数としてではなく、「(int[2]){ 1
」と「」の2つの引数として解析するため、gccはこれをバーフし2 }
ます。
これはgccまたはC標準のバグですか?後者の場合、それは関数のようなマクロのすべての透過的な使用をほぼ除外します。これは大きな欠陥のようです...
編集:例として、以下が適合プログラムフラグメントであることが期待されます。
fgetc((FILE *[2]){ f1, f2 }[i]);
ただしfgetc
、マクロとして実装できるため(引数を保護し、複数回評価しないようにする必要がありますが)、このコードは実際には正しくありません。それは私には驚きのようです。