在C语言中定义整数范围

13

我想定义一个名为 Int_1_100_Type 的类型,它是一个取值范围为1到100的 integer 变量。该如何定义?
例如: 我要把这个变量传给一个接受 Int_1_100_Type 类型变量的函数, funca(Int_1_100_Type Var1)


10
为什么被踩?仅因为问题无法在C语言中实现并不意味着问题不够清晰或不合理。 - T.J. Crowder
为什么要这样做?如果您的函数需要特定范围内的输入,您可以在常规int变量上进行边界检查。 - tzaman
8
如果语言支持它(某些语言确实支持),那么这是一个很好的功能,可以避免在代码各处编写范围检查。 - anon
5个回答

7

您不能这样做,因为C语言没有这样的功能。当然,您可以使用typedef来定义一个int类型:

typedef int int_1_100_Type;

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


也许如果有人精神错乱,可以用“枚举”来伪造它?当然,即使这样也无法阻止任何人传递任何旧整数。 - tzaman
不完全是这样。枚举类型始终具有包括0在内的范围,可能的值的数量始终是2的幂。经典示例:enum rights {Read = 1, Write = 2}; 的范围包括0(无权限)和3(读写权限)。 - MSalters
在这种情况下,您甚至可以使用 typedef 定义一个 char - caf
@MSalters:不是这样的。是的,这是枚举的常见用例,但枚举的按位组合在技术上并不属于枚举的一部分。整个东西相当无用,因为您可以将任何值存储到“enum”类型的变量中。 - mbauman
@Matt B:这就是我说它们是“范围”的一部分的原因。关于“任何值”,你是错的。标准肯定不能保证你可以从我的先前示例中将INT_MAX转换为enum rights,例如当sizeof(rights) < sizeof(int)时。 - MSalters

4
当然可以。你只需要一点基于对象的 C 语言。
创建一个带有结构体和一些成员的文件。
typedef struct s_foo {
  int member;
} Foo;

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

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

如果您将其放在自己的文件中,您还可以隐藏类的实现,您可以像C一样进行面向对象编程


在最近几个月里,我学习了一种更好的方法来做这件事。这有点复杂,但以下是简短的版本。将"newFoo"和"get"作为结构体Foo的成员(其中包含函数指针),您可以在单独的C文件中实现"newFoo"和"get"作为静态函数,只要您拥有一个用于Foo的构建器(它将提供封装、实现隐藏(某个级别)和一个很好的抽象接口来创建类型为Foo的对象)。 - shiva

2

你不能对整数的范围设置这种限制。

当然,你可以使用typedef定义它:

typedef int int_1_100;

甚至更好的是:
typedef unsigned int int_1_100;

但是在C语言中,并没有阻止你编写以下代码:

int_1_100 x = 1000;

要实现这样的功能,你需要隐藏实现细节,但这会使初始化变得更加困难(并且无法在保持隐藏的情况下在堆栈上分配该类型的值)。

从你写这个答案到现在已经有5年了,我想问你一些问题。第二个typedef怎么比第一个更好了?唯一的区别就是在第二种情况下需要打更多的字。它们都涵盖了所需的范围(1-100),它们占用的空间相同,超出范围的值也相同,对吧?最重要的是,正如你所知道的,int是多字节类型(int使用的字节数取决于CPU/OS),为什么不仅使用char作为类型,它基本上是始终需要1个字节并且覆盖1-100范围的int(对于unsigned char也适用,但是又���又难打)。只是好奇。 - Wh1T3h4Ck5

1
在C++中,可以通过编写一个类来模拟整数的方式来实现这一点,但这样做需要付出太多的努力,而且解决方案过于笨重,不切实际。
感谢Naveen指出问题只涉及C语言。

3
标记为"C"而非"C++"的问题。 - Naveen
哦,是的,我的错... 这确实只有在C++中才可能实现。 - wich

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接