2026-09-15
grant.c
void grant_read(void);
void grant_write(void);
void grant_admin(void);
void grant(int level) {
// write this: level 3 grants admin, write and read;
// level 2 grants write and read; level 1 grants read only
}
switchを1つ使い、各grant_*の呼び出しをソース上で1回ずつだけ書いてgrantを実装してください。フォールスルーが意図的であることは、C23の構文で明示すること。
Reference
void grant(int level) {
switch (level) {
case 3:
grant_admin();
[[fallthrough]];
case 2:
grant_write();
[[fallthrough]];
case 1:
grant_read();
break;
}
}
C23では属性構文[[...]]が標準に入り、その1つが[[fallthrough]];です。次のcaseラベルの直前に置くと「ここはbreakの書き忘れではない」と表明でき、-Wimplicit-fallthroughなどの警告も止まります。それまでは/* fall through */というコメントに頼るしかありませんでした。これは参考実装であり、唯一の正解ではありません。