我正在尝试使用clang 3.1和选项-Weverything
编译此代码:
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
SDL_Surface* init(SDL_Surface* screen);
int main() {
SDL_Event event;
SDL_Surface* screen = NULL;
int quit = 0;
screen = init(screen);
if (screen == NULL) {
return EXIT_FAILURE;
}
while(quit == 0) {
while(SDL_PollEvent(&event)) {
if( event.type == SDL_QUIT ) {
quit = 1;
} else if( event.type == SDL_KEYDOWN ) {
switch( event.key.keysym.sym ) {
case SDLK_UP: printf("up\n"); break;
case SDLK_DOWN: printf("down\n"); break;
case SDLK_LEFT: printf("left\n"); break;
case SDLK_RIGHT: printf("right\n"); break;
default: break;
}
}
}
}
SDL_FreeSurface(screen);
SDL_Quit();
return 0;
}
SDL_Surface* init(SDL_Surface* screen) {
if( SDL_Init(SDL_INIT_EVERYTHING) == -1) {
return NULL;
}
screen=SDL_SetVideoMode(100,100,32,SDL_SWSURFACE);
return screen;
}
编译器然后返回以下警告
main.c:22:25: warning: 229 enumeration values not explicitly handled in switch: 'SDLK_UNKNOWN', 'SDLK_BACKSPACE',
'SDLK_TAB'... [-Wswitch-enum]
switch( event.key.keysym.sym ) {
^
在其他地方,我已经阅读了类似的错误消息,人们通过添加default
案例解决了这个问题,但是在这里您可以看到它已经存在。我真的想在没有一个警告的情况下编译我的代码,当然这里不需要放置229个可能的情况。
答案 0 :(得分:12)
从这个链接:
http://clang-developers.42468.n3.nabble.com/Question-on-Wswitch-enum-td4025927.html
编译(参见可能的更改评论)-Weverything -Wno-switch-enum
海湾合作委员会的文件: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-Wswitch 每当switch语句具有枚举类型的索引且缺少a时发出警告 该枚举的一个或多个命名代码的大小写。 (存在的 默认标签可防止此警告。)枚举范围之外的案例标签 使用此选项时也会引发警告(即使存在默认值) 标签)。 -Wall启用此警告。
-Wswitch-枚举 每当switch语句具有枚举类型的索引且缺少a时发出警告 该枚举的一个或多个命名代码的大小写。案例标签 在使用此选项时,枚举范围之外也会引发警告。
-Wswitch和此选项之间的唯一区别是此选项 即使存在默认值,也会发出有关省略的枚举代码的警告 标签&LT;。&LT;&LT;