The variable given to a switch must be an int or a defined type that resolves to an int (long int might work too, it's been awhile). The reason for this is that a switch compiles into a jump table. This is important because finding what you're looking for in a jump table would take O(1) time instead of the O(n) time (where n is the number of conditionals) it could take to check every conditional if you were to implement this as a series of if()/elseif() statements.

It's also worth pointing out that you'll probably want to put a "break;" at the end of every block of code after a condition. If you don't your code will go to the correct condition and then execute all the code after that, including code intended for other conditions. Of course this may be what you want. See Duff's Device.

Update: wharfinger has brought it to my attention that a switch doesn't always compile to a jump table. This caused me to drag out my copy of the Dragon Book. On pages 497-498 it says that if there are less than 10 values or so you can implement it as "a sequence of conditional goto's." If there are more than 10 use a hash table. However, no matter how many values you have, if they are reasonably contiguous use a jump table.

Of course depending on your compiler and your optimization settings YMMV.