-
-
Save theonewolf/5486167 to your computer and use it in GitHub Desktop.
| #include <stdio.h> | |
| #include <stdlib.h> | |
| enum option | |
| { | |
| OPT_ONE = 0x01, | |
| OPT_TWO = 0x02, | |
| OPT_THREE = 0x03, | |
| OPT_FOUR = 0x04, | |
| OPT_MAGIC = 0x05 | |
| }; | |
| void test_switch(enum option opt) | |
| { | |
| switch(opt) | |
| { | |
| OPT_ONE: | |
| fprintf(stdout, "OPT_ONE\n"); | |
| break; | |
| OPT_TWO: | |
| fprintf(stdout, "OPT_TWO\n"); | |
| break; | |
| OPT_THREE: | |
| fprintf(stdout, "OPT_THREE\n"); | |
| break; | |
| OPT_FOUR: | |
| fprintf(stdout, "OPT_FOUR\n"); | |
| break; | |
| OPT_MAGIC: | |
| fprintf(stdout, "OPT_MAGIC\n"); | |
| break; | |
| default: | |
| fprintf(stdout, "default, no match found.\n"); | |
| }; | |
| } | |
| int main(int argc, char* argv[]) | |
| { | |
| test_switch(OPT_MAGIC); | |
| return EXIT_SUCCESS; | |
| } |
Perhaps file this against pygments. Emacs at least highlights the difference.
well... with the right compiler options it doesn't compile.
$ make foo
cc -Werror -Wall -Wextra -Wold-style-definition -Wmissing-declarations -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default -Winit-self -Wmissing-include-dirs -Wundef -Waggregate-return -Wmissing-format-attribute -Wnested-externs -std=c11 -pedantic foo.c -o foo
foo.c: In function ‘test_switch’:
foo.c:16:2: error: enumeration value ‘OPT_ONE’ not handled in switch [-Werror=switch-enum]
switch (opt) {
^
foo.c:16:2: error: enumeration value ‘OPT_TWO’ not handled in switch [-Werror=switch-enum]
foo.c:16:2: error: enumeration value ‘OPT_THREE’ not handled in switch [-Werror=switch-enum]
foo.c:16:2: error: enumeration value ‘OPT_FOUR’ not handled in switch [-Werror=switch-enum]
foo.c:16:2: error: enumeration value ‘OPT_MAGIC’ not handled in switch [-Werror=switch-enum]
foo.c:29:3: error: label ‘OPT_MAGIC’ defined but not used [-Werror=unused-label]
OPT_MAGIC:
^
foo.c:26:3: error: label ‘OPT_FOUR’ defined but not used [-Werror=unused-label]
OPT_FOUR:
^
foo.c:23:3: error: label ‘OPT_THREE’ defined but not used [-Werror=unused-label]
OPT_THREE:
^
foo.c:20:3: error: label ‘OPT_TWO’ defined but not used [-Werror=unused-label]
OPT_TWO:
^
foo.c:17:3: error: label ‘OPT_ONE’ defined but not used [-Werror=unused-label]
OPT_ONE:
^
cc1: all warnings being treated as errors
make: *** [foo] Errore 1
$
@ZeeD that's the reason why this was linked to as a "brain teaser" not a "compiler teaser." Although many brains are also good enough for this one it seems :-)
OPT_*are labels, not cases, so the program reaches thedefaultcase.