Create a gist now

Instantly share code, notes, and snippets.

@theonewolf /switch.c
Last active Dec 16, 2015

switch brain teaser
#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;
}
@tipt0e
tipt0e commented Apr 30, 2013

default, no match found.
no case keywords

@peterldowns

OPT_* are labels, not cases, so the program reaches the default case.

@adeodatus

Perhaps file this against pygments. Emacs at least highlights the difference.

@ZeeD
ZeeD commented Apr 30, 2013

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
$

@theonewolf
Owner

@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 :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment