【发布时间】:2013-05-19 05:25:23
【问题描述】:
我正在尝试使用 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 种可能的情况。
【问题讨论】:
-
stackoverflow.com/questions/14407282/… ,因为这家伙正在使用 Xcode,我猜后面的编译器是 clang,但他确实没有准确地说明他使用了哪些选项。
-
对于某些用例,可以使用为每个枚举器定义动作和名称的宏来获得更好的代码质量;如果确实目标是打印枚举器名称,这可能是其中之一。我已经为类似的 C++ 问题写了an answer。当然,编写 229 个条目仍然很乏味,而且可能令人望而却步,但至少它不会弄乱您的实际代码,并且该方法可以防止将来添加枚举器。
标签: c enums clang suppress-warnings