如果在参数列表中使用了另一个typedef类型的名称,则发出警告

考虑一个大型项目,其中许多类型是typedef ,例如

 typedef int age; typedef int height; 

和一些函数获取这些类型的参数:

 void printPerson(age a, height h) { printf("Age %d, Height %d\n", a, h); } 

有没有办法在编译时警告,如果这些参数是错误的类型,例如

 age a = 30; height h = 180; printPerson(h, a); /* No warning, because a and h are both integers */ 

在这种情况下,gcc(或某些静态代码分析工具)是否有选项可以发出警告?

GCC中没有内置支持。

根据Sparse nocast属性,有一个要添加此function的function请求 。 但是,这还没有实施。 但是,如果可以使用Sparse,则可以通过使用__attribute__((nocast))标记每个typedef来完成此操作。

在C ++中,您可以通过创建包装类而不是typedef来完成此操作,然后只是不为它们定义隐式转换。

Klocwork有一些与他们称之为“强类型”相关的检查。

对于您的代码,它会抛出STRONG.TYPE.ASSIGN.ARG,因为参数类型不匹配。

它还抱怨将int值(consts)分配给ageheight类型的变量,以及在printf中将变量用作int

不过我听说它很贵。

正如其他回复所表明的那样,你不会从gcc中免费获得这个。 您肯定是进入静态分析工具的世界来解决这个问题。

对此有一些建议,其中一些需要额外的注释,其中一些不是,但可能比你正在寻找的更多。 因此,我想我会再投入一个……

我一直坚持使用各种命令行lint工具。 在你的情况下,我认为PC-lint / flexelint非常适合即使它是一个商业工具。 请看这里强大的类型检查。

不,不可能。 如果您正在做(或即将做) 非法的事情,编译器会发出警告。 它不应该知道(或确定)将作为函数参数传递的的正确性。 只要类型相同,就没有任何理由抱怨。

但是,如果类型不匹配,它会提醒您。

仅当类型不同时才会生成错误。 你可以将这些类型包装在struct中,并使用宏来自动定义和赋值。

如果您愿意使用枚举而不是整数,则可以选择在名为coverity的静态代码分析工具中使用混合枚举时发出警告。

https://wiki.ubuntu.com/CoverityCheckerDictionary寻找MIXED_ENUMS。

正如其他人已经说过的那样,在C中没有对此的支持。如果你绝对想要进行强类型检查,你可以这样做:

 typedef struct {int a;} age; typedef struct {int h;} height; void printPerson(age a, height h) { printf("Age %d, height %d\n", aa, hh); } age a = {30}; height h = {180}; printPerson(h, a); // will generate errors 

但请注意,这可能会对性能产生一些影响。