4

如何让 XCode (4.5, 4G182) 在 switch/case 构造中完成案例,并警告我缺少案例?

例如:

for (int i=0;i<[flat elementCount];i++) {
    NSPoint elements[3];
    NSBezierPathElement elem=[flat elementAtIndex:i associatedPoints:elements];
    switch (elem ) {
        case NSMoveToBezierPathElement: break;
        case NSLineToBezierPathElement: break;
        case 

我过去曾见过这种情况。一旦街区关闭,它还警告我有关失踪案件。XCode 4.5 你怎么能做到这一点?

编辑:检查开关语句是否启用,我没有警告。

这是一个完成工作的小例子:

typedef enum  {
    kThisCase = 0,
    kThatValue = 1,
    kLastOne = 2
} myEnum;

myEnum var= kLastOne;

switch (var) {
    case kThatValue: break;
    case kLastOne: break;
    case 

CTRL+SPACE这里给了我 myEnum 的剩余可能值

完成工作 完成不工作

在 NSBezierPathElement 完成的情况下,当我添加这个时:

typedef enum {
    NSMoveToBezierPathElement,
    NSLineToBezierPathElement,
    NSCurveToBezierPathElement,
    NSClosePathBezierPathElement
} NSBezierPathElement;

(从快速帮助面板复制)在开关构造之前,自动完成工作,但警告没有。

NSBezierPath.h 的内容

enum {
    NSMoveToBezierPathElement,
    NSLineToBezierPathElement,
    NSCurveToBezierPathElement,
    NSClosePathBezierPathElement
};
typedef NSUInteger NSBezierPathElement;

这是完成不起作用的解释吗?这个枚举不应该是 NSBezierPathElement 的类型吗?

这与快速帮助面板不匹配。在快速帮助面板中,我有这个:typedef enum { NSMoveToBezierPathElement, NSLineToBezierPathElement, NSCurveToBezierPathElement, NSClosePathBezierPathElement} NSBezierPathElement;

4

1 回答 1

3

您需要一个默认启用的编译器设置。在构建设置中搜索“case”,并找到名为“Check Switch Statements”的(标题),这是 GCC_WARN_CHECK_SWITCH_STATEMENTS。

我认为这需要枚举实际上已正确定义,而不是 NSInteger 等。如果常量是整数,而不是枚举,那么检查将无济于事,因为编译器不知道整数是相关的。

另外,非常重要的是,删除 default: 子句。如果它在那里,那么您正在隐式处理此案例中的所有缺失案例,因此不会触发警告!

于 2012-09-25T10:04:41.260 回答