【问题标题】:Clang with C code: enumeration values not explicitly handled in switchC 代码 Clang:枚举值未在 switch 中显式处理
【发布时间】: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


【解决方案1】:

从此链接:

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

使用 -Weverything -Wno-switch-enum 编译(请参阅 cmets 了解可能的更改)

GCC 的文档: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-W开关 每当 switch 语句具有枚举类型的索引并且缺少 该枚举的一个或多个命名代码的大小写。 (存在一个 默认标签可防止此警告。)枚举范围之外的案例标签 使用此选项时也会引发警告(即使有默认 标签)。此警告由 -Wall 启用。

-Wswitch-枚举 每当 switch 语句具有枚举类型的索引并且缺少 该枚举的一个或多个命名代码的大小写。案例标签 使用此选项时,超出枚举范围也会引发警告。

-Wswitch 和这个选项的唯一区别是这个选项 即使存在默认值,也会给出有关省略枚举代码的警告 标签。

【讨论】:

  • 我今天刚试过,-Wno-switch-enum 没有用,但-Wno-switch 成功了。我想它已经改变了一点。
  • 我尝试了-Wno-switch-enum-Wno-switch,但都没有成功。
  • @DonaldDuck 什么编译器和版本?如果可以,请链接到一个godbolt示例。
  • @xaxxon 编译器是 Android Clang (C++, arm, NDK 21.3.6528147)。 Here 是一个简单的示例,即使同时使用 -Wno-switch-enum-Wno-switch 也会发出警告。
  • @DonaldDuck 如果您在此处发布示例,您实际上可以显示正在发生的错误。 godbolt.org
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
相关资源
最近更新 更多