禁用编译器中的默认数值类型

时间:2012-08-12 21:18:27

标签: c++

为整数创建自定义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,这会导致一些问题。此警告将警告用户不要在代码中使用int。

如果可能的话,如果这可以在GCC和VC ++ 2012上运行,那就太棒了。

4 个答案:

答案 0 :(得分:1)

我有理由相信gcc没有这样的选择,如果VC做了我会感到惊讶。

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

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

但我不会绝对禁止。有许多使用预定义类型的标准库函数。例如,在c = getchar()中,将c声明为int以外的任何内容都没有意义。对for (int i = 0; i <= 100; i ++) ...

之类的东西没有问题

理想情况下,目标应该是正确使用预定义类型 。该语言从未保证int可以超过32767.(但“正确”使用很难或无法自动验证。)

答案 1 :(得分:0)

我先做一个替换,然后再彻底记录下来。

您可以使用预处理程序指令:

#define int use kint instead

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

答案 2 :(得分:0)

我建议批量更换int - &gt;在移植开始时old_int_t。这样,您可以继续修改代码,而不会遇到重大限制,同时可以访问尚未更新的所有地方。

最终,在您的工作结束时,old_int_t的所有出现都应该消失。

答案 3 :(得分:0)

即使可以某种方式取消定义关键字int,也无法阻止使用该类型,因为很多情况下编译器最终会使用该类型。除了明显的整数文字的情况之外,还有一些涉及整数提升的微妙案例。例如,如果int恰好是64位,则类型uint32_t的两个变量之间的操作将使用类型int而不是uint32_t执行。尽管能够指定某些变量代表数字(在实际时应该热切地提升),而其他变量代表包装代数环(其中不应该被提升),我知道没有办法做这样的事情。因此,int是不可避免的。