0

在为整数创建自定义 typedef 时,编译器是否可以在您使用默认数字类型时发出警告?

例如,

typedef int_fast32_t    kint;

int_fast32_t test=0;//Would be ok
kint test=0; //Would be ok
int test=0; //Would throw a warning or error

我们正在转换一个大型项目,int平台上的默认大小32767导致了一些问题。此警告将警告用户不要在代码中使用整数。

如果可能的话,如果这适用于 GCC 和 VC++2012,那就太好了。

4

4 回答 4

1

我有理由确定 gcc 没有这样的选择,如果 VC 有,我会感到惊讶。

我建议编写一个程序来检测源代码中对预定义类型的引用,并在构建过程中自动调用该工具。搜索某些关键字可能就足够了。

确保将其限制为您自己的源文件;预定义和第三方标头可能会广泛使用预定义类型。

但我不会绝对禁止。有许多使用预定义类型的标准库函数。例如, inc = getchar()声明cint. 像这样的东西没有问题for (int i = 0; i <= 100; i ++) ...

Ideally, the goal should be to use predefined types properly. The language has never guaranteed that an int can exceed 32767. (But "proper" use is difficult or impossible to verify automatically.)

于 2012-08-12T21:25:18.060 回答
0

我会先做一个全部替换然后彻底记录这个来解决这个问题。

您可以使用预处理器指令:

#define int use kint instead

请注意,从技术上讲,这是未定义的行为,如果在包含第三方标头之前进行此定义,您将遇到麻烦。

于 2012-08-12T21:23:14.637 回答
0

I would recommend to make bulk replacement int -> old_int_t at the very beginning of your porting. This way you can continue modifying your code without facing major restrictions and at the same time have access to all places that are not yet updated.

Eventually, at the end of your work, all occurencies of old_int_t should go away.

于 2012-08-12T21:27:41.980 回答
0

即使可以以某种方式取消定义关键字int,也不会阻止使用该类型,因为在许多情况下编译器最终会使用该类型。除了整数文字的明显情况之外,还有一些涉及整数提升的更微妙的情况。例如,如果int恰好是 64 位,则两个类型变量之间的操作uint32_t将使用 typeint而不是uint32_t. 能够指定一些变量表示数字(在实际情况下应积极提升)而其他变量表示环绕代数环的成员(不应提升),这将是一件好事,但我不知道这样做的便利一个东西。因此,int不可避免。

于 2014-03-15T23:44:07.313 回答