2010-01-18 72 views
6

清理使用硬编码整数文字而不是枚举的旧c/C++代码,找到函数声明已被正确重构但不是主体的地方是很繁琐的。例如是否有任何可以警告(或给出错误)或枚举转换为int的c/C++编译器?

enum important { 
    little = 1, 
    abit = 2, 
    much = 3 
}; 

void blah(int e) 
{ 
    // magic stuff here 
} 

void boing(int e) { ... } 

void guck(important e) 
{ 
    switch (e) { 
    case 3: // this would be a good place for a warning 
     blah(e); // and this 
     break; 
    default: 
     boing((int)e); // but this is OK (although imperfect and a warning would be acceptable) 
     break; 
    } 
} 

诠释/修改每个枚举类型或通过代码搜索他们也将是工作的相当数量的,因为有非常非常多的不同的枚举,所以这不是优选的,但可能是可接受的解决方案。

我不需要它在我们的主要编译器或其他工具(主要是gcc)或平台(大多数)中,手动运行它几次就足够了,但我更喜欢那些不是太深奥或昂贵。

+0

不是gcc处理这个完美吗?我使用g ++并总是看到描述的警告。纯粹的C编译器的行为有什么不同? – Basilevs 2010-01-18 10:14:27

+0

不,编译此代码(减...并加上一个空的main()):g ++ -Wall test.cpp给出0个警告。从int到enum的提升受到警告,但不是其他方式。如果你有其他方式工作,请给我你的命令行。请... – 2010-01-18 10:51:22

回答

1

皮棉将提供此警告对于你(条件641)

641转换枚举为int - 枚举类型是在一个上下文 所需的计算中使用,例如作为参数传递给算术运算器或与积分论证相比是 。如果您使用枚举的整数模型(+ fie),则此警告将被抑制,但这样做会损失一些有价值的 类型检查。一个中间策略是简单地关闭这个 警告。将int分配给枚举仍将被捕获。

夹板(http://www.splint.org/download.html)是一家现代化的皮棉可以使用

+0

是的,对于较小的c部分,不幸的是我们有C++风格的评论,所以立即夹板呕吐,我想我可以sed那些。你知道任何OK的C++能力或至少忽视棉绒吗? – 2010-01-18 10:52:53

1

Sparse(语义检查Linux内核人们用工具)可以帮助你的一些这样。

这些选项可以捕获enum错误的子集:-Wenum-mismatch,-Wcast-truncate。但是,我通过此代码运行了代码,看起来不像其中任何被捕获的代码。

这是免费软件,你应该扩展它。

相关问题