8

私はこのコードを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 の可能なケースを配置する必要はありません。

4

1 に答える 1

13

このリンクから:

http://clang-developers.42468.n3.nabble.com/Question-on-Wswitch-enum-td4025927.html

でコンパイルします(可能な変更についてはコメントを参照してください)-Weverything -Wno-switch-enum

GCC のドキュメント: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-Wswitch switch ステートメントに列挙型のインデックスがあり、その列挙型の名前付きコードの 1 つ以上のケースが不足している場合は常に警告します。(デフォルト ラベルが存在すると、この警告が回避されます。) このオプションが使用されると、列挙範囲外のケース ラベルも警告を引き起こします (デフォルト ラベルが存在する場合でも)。この警告は -Wall によって有効になります。

-Wswitch-enum switch ステートメントに列挙型のインデックスがあり、その列挙型の名前付きコードの 1 つまたは複数のケースが不足している場合は常に警告します。このオプションを使用すると、列挙範囲外のケース ラベルも警告を発します。

-Wswitch とこのオプションの唯一の違いは、このオプションは省略された列挙コードについて警告を表示することです。たとえデフォルト ラベルがあっても。<<<

于 2013-05-19T05:40:39.103 に答える