2014-06-16 30 views
2

是否有一种方法可以对整个程序或整个模块使用未检查项?如何在c中使用多个未检查项#

我正在翻译一些java类型的东西,它有很长的类型和很多与无符号长常量比较的东西...有些地方有一些开关,有20〜30个例子...我是否必须取消选中每个例子个人或有更快/更简单的方法来做到这一点?

case 101: 
    return jjMoveStringLiteralDfa5_0(active0, 0x8002010000000000L, active1, 0x1L); 

我得改:

return jjMoveStringLiteralDfa5_0(active0, unchecked((long)0x8002010000000000L), active1, 0x1L); 

但也有很多时候......它是有很多IF的的解析器生成,所以这将是最好有一些压制那些检查整个文件,而不是搜索每个可能的地方,将产生这些无符号的长常量...

有一种方法来设置Visual Studio选项,但因为我生成一个解析器,我想知道如果我可以自动解析器不检查溢出/ unde rflows,这可能吗?

+1

你的意思是像'unchecked {//此处代码}' –

+0

是的,类似的东西...但它似乎并不工作 – nightshade

+0

是的,我想它没有检查使用ulong时的溢出长 – nightshade

回答

3

如果你想用十六进制文字来表达通过补约定负整数,你只是以提供一个演员和一个明确的使用unchecked关键字。例如:

sbyte b = unchecked((sbyte)0xAB); 
short s = unchecked((short)0xABCD); 
int i = unchecked((int)0xABCDABCD); 
long l = unchecked((long)0xABCDABCDABCDABCD); 

这是不够的(如由C#编译器开关和/或csproj文件中定义)的默认上下文是“未选中”上下文。

如果您可以使用无符号类型(例如uint),则不会出现此问题。但是无符号类型通常不被BCL使用,并且不被视为“符合CLS”。


就让它完全清楚,与积极文本,则既不需要投也不unchecked关键字:

sbyte b = 0x2E; 
short s = 0x2E3F; 
int i = 0x2E3F2E3F; 
long l = 0x2E3F2E3F2E3F2E3F; 

对于常量表达式隐式转换存在使这个容易,看到Implicit constant expression conversions

+0

但是有没有办法让我隐藏这个演员阵容,这样我就不必一直投射了?比如:“只要你需要将ulong转换为long,就像这样(my_conversion)” – nightshade

+0

@nightshade你必须调用你自己的方法,这可能是一个扩展方法。编辑:转换将不再在编译时完成;这将是一个运行时间的事情(但可能是“空”性能命中)。 –

+0

哼哼...我猜我只是打CTRL + F,并在产生代码的部分找到所有“0x”字符串,然后在它之前添加(长)或(int)... – nightshade

相关问题