【问题标题】:Value stored to 'var name' is never read存储到“var name”的值永远不会被读取
【发布时间】:2012-02-08 13:56:18
【问题描述】:

我正在为编译器警告而苦苦挣扎。代码如下:

    const char *sql;
switch (fromVersion) {
    case 0:
    {
        sql = "ALTER TABLE abiliator_options ADD COLUMN new_column00 TEXT NOT NULL DEFAULT 'migrated from version 0'";
    }
    case 1:
    {
        sql = "ALTER TABLE abiliator_options ADD COLUMN new_column01 TEXT NOT NULL DEFAULT 'migrated from version 1'";
    }
    case 2:
    {
        sql = "ALTER TABLE abiliator_options ADD COLUMN new_column02 TEXT NOT NULL DEFAULT 'migrated from version 2'";
    }
    case 3:
    {                       
        sql = "ALTER TABLE abiliator_options ADD COLUMN new_column03 TEXT NOT NULL DEFAULT 'migrated from version 3'";
    }
    case 4:
    {                       
        sql = "ALTER TABLE abiliator_options ADD COLUMN new_column04 TEXT NOT NULL DEFAULT 'migrated from version 4'";
    }
    case 5:
    {                       
        sql = "ALTER TABLE abiliator_options ADD COLUMN new_column05 TEXT NOT NULL DEFAULT 'migrated from version 5'";
    }
}


sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) 
{
    if (sqlite3_step(selectstmt) == SQLITE_DONE) 
    {           
        NSLog(@"Alter statement successful");
        [self setDatabaseSchemaVersion];
    }
    else {

        NSLog(@"Failed to alter the table with message '%s'.", sqlite3_errmsg(database));
    }
}
else {
    NSLog(@"Failed to prepare the statement with message '%s'.", sqlite3_errmsg(database));

}
sqlite3_finalize(selectstmt);

第一个警告是,对于所有 sql var 分配,从不读取存储到“sql”的值,开关中的最后一个除外(案例 5)。案例 5 不会导致警告。

第二个警告是函数调用参数是一个未初始化的值。这是为了 if(sqlite3_prepare_v2(数据库, sql, -1, &selectstmt, NULL) == SQLITE_OK) 声明。

提前感谢您的提示。

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    您在每个案例之后都错过了休息时间。只使用最后一个分配。

    【讨论】:

      【解决方案2】:
      1. 这是因为您的案例之间缺少break; 语句。
      2. 这是因为您缺少default:

      编译器告诉您,例如,当您的 fromVersion 为 4 时,您在 case 4: 中分配给它的任何内容都会立即被 case 5: 覆盖,因为没有 break。它还告诉您,当fromVersion 为负数或大于5 时,您的sql 未初始化。

      【讨论】:

        【解决方案3】:

        添加休息;每个案例后的声明。 进一步尝试添加默认情况。

        【讨论】:

          【解决方案4】:

          Switch 语句结构:- 你缺少“break”和“default:”

          开关(表达式)

          { 案例匹配1:

                statements
          
                break;
          
           case match2:
          
                statements
          
                break;
          
           default:
          
                statements
          
                break;
          

          }

          【讨论】:

            【解决方案5】:

            警告很可能是因为您没有在开关中使用break;(您在旧值上设置了新值,但没有使用它们)。

            switch (fromVersion) {
            case 0:
            {
                sql = "ALTER TABLE abiliator_options ADD COLUMN new_column00 TEXT NOT NULL DEFAULT 'migrated from version 0'";
                break;
            }
            case 1:
            {
                sql = "ALTER TABLE abiliator_options ADD COLUMN new_column01 TEXT NOT NULL DEFAULT 'migrated from version 1'";
                break;
            }
            ...
            

            【讨论】:

            • 不知何故,我从回答我的变成了编辑你的,对不起,我把你的回滚了。
            • 谢谢大家。忘记了开关需要这些休息。认为它们只在循环中需要。但是 if (sqlite3..) 语句中的未初始化值警告仍然存在。
            • 第二个警告可能会出现,因为您缺少 default(参见 user1186899 的示例),在这种情况下,sql 可能保持未初始化状态。
            • 是的,就是这样,巴比迪。在纠正代码时,有时 XCode 需要一段时间才能删除所有警告。谢谢。
            猜你喜欢
            • 2013-11-22
            • 1970-01-01
            • 2011-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-11
            • 2018-07-26
            相关资源
            最近更新 更多