为整数创建自定义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上运行,那就太棒了。
答案 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
是不可避免的。