问题 用C定义整数范围


我想定义一个名为的类型 Int_1_100_Type 这是一个 integer 变量范围从1到100。 我应该如何定义这个?
例如: 我将此变量传递给接受变量类型的函数 Int_1_100_Typefunca(Int_1_100_Type Var1)


12467
2018-04-14 12:09


起源

为什么选择downvote?仅仅因为OP想要做的事情不能在C中完成,并不意味着问题不够明确和合理。 - T.J. Crowder
你为什么想做这个?如果你的函数需要在特定范围内输入,你可以在常规上进行边界检查 int 变量。 - tzaman
@tzaman如果语言支持它(有些人会这样做),这是一个很好的功能,并避免在整个地方编写范围检查。


答案:


你不能,C没有这样的功能。你当然可以输入一个int:

typedef int int_1_100_Type;

但是没有办法限制它的范围。在C ++中,您可以使用此功能创建一个新类型,但我认为很少有人会打扰 - 您只需要在使用该类型的函数中放置范围检查。


5
2018-04-14 12:10



也许有人可以假装它 enum,如果一个人临床上疯了吗?当然,即使这样也不会阻止任何人传递任何旧的整数。 - tzaman
不是真的。枚举总是具有包含0的范围,并且可能值的数量总是2的幂。经典示例:范围 enum rights {Read = 1, Write = 2}; 包括0(无权利)和3(两者)。 - MSalters
你甚至可以 typedef 一个 char 在这种情况下。 - caf
@MSalters:不是真的。这是枚举的常见用例,是的,但枚举的按位组合在技术上并不是枚举的一部分。但是,整个过程毫无价值,因为你可以存储任何值 enum 键入的变量。 - Matt B.
@Matt B:这就是我说他们参与其中的原因 范围。你错了“任何价值”。标准当然不保证您可以将INT_MAX转换为 enum rights 从我之前的例子,例如什么时候 sizeof(rights) < sizeof(int) - MSalters


当然可以。你需要的只是一个基于对象的小C。

使用结构和一些成员创建一个文件

typedef struct s_foo {
  int member;
} Foo;

Foo* newFoo(int input);   // ctor
void get(Foo *f);         // accessor

在mutator / ctor中强制执行你的条件

如果你在自己的文件中这样做,你也可以隐藏类的impl,你可以做类似C的o


4
2018-04-14 18:17



(Grr ......评论中没有形成)在最近几个月里,我学到了更好的方法。它有点复杂,但这是短版本。添加“newFoo”和“get”作为struct Foo(包含函数指针的成员)的成员,并且只要你有一个构建器就可以在单独的C文件中实现“newFoo”和“get”作为静态函数for Foo(它将提供封装,实现隐藏(某种程度),以及一个很好的抽象接口来创建Foo类型的对象) - shiva


你不能把这种限制放在整数的范围内。

你当然可以 typedef 无论如何:

typedef int int_1_100;

甚至更好:

typedef unsigned int int_1_100;

但是C中的任何内容都不会阻止你写作:

int_1_100 x = 1000;

要实现类似的东西,你需要隐藏实现,但这会使初始化值变得更加困难(并且不可能在堆栈上分配类型的值,隐藏完整)。


1
2018-04-14 12:12





c中没有办法定义必须在特定范围内的类型。但是,您可以检查函数中的每个值,例如

int funca(int Var1)
{
    assert(Var1 >= 1);
    assert(Var1 < 101);
    ...
}

0
2018-04-14 12:14





在C ++中,有一种方法可以通过编写一个类似于整数的类来实现这一点,但这将是太多的努力和太重量级的解决方案才能实用。

感谢Naveen指出问题只是C。


0
2018-04-14 12:13



问题被标记为c而不是c ++。 - Naveen
呃,是的,我的坏...这确实只有在C ++中才有可能 - wich