如何确定模糊的c类型

时间:2017-05-03 06:24:40

标签: c

好吧,这是一个愚蠢的问题,因为我已经在C编码了一段时间,但我从来没有真正弄明白。

C库喜欢实现自己的模糊数据类型,这些类型通常似乎是对现有类型的重新实现(提示此问题的库是http://man7.org/linux/man-pages/man2/gettimeofday.2.html)。

我的问题是:你究竟应该弄清楚这些一次性数据类型究竟是什么?它们似乎永远不会在手册页中的任何地方定义,因此很少深入挖掘头文件的源代码我不知所措。例如,从上面提到的手册页中,什么是“suseconds_t”,以及在一般情况下,我将如何弄清楚具体内容是什么?

2 个答案:

答案 0 :(得分:2)

suseconds_t是一个有符号整数类型,可以适应一秒钟内的微秒数。类型为suseconds_t,而不是其他任何类型。这些“模糊”类型的重点是让你使用它们而不是“哦,我只是使用int因为那是我经常使用的”然后你的程序变得不可移植到其他机器或某个时候未来。

你在“C库喜欢......”中略显居高临下的语气是非常误导的。这不是一些不起眼的图书馆做一些不起眼的小搞笑的事情。这是POSIX

答案 1 :(得分:0)

大多数情况下,您应该进行编码,以使基础类型无关紧要。 这是便携式,面向未来的代码的想法。在不同的平台或升级类型中,类型可能会发生变化,而现有代码应该只是选择它。

但是存在潜在的缺陷。对于像susecond这样的标量类型,您可能需要输出它,并且库应该为输出提供PRI样式宏,并为读取提供SCN样式宏。见<inttypes.h>。 否则你最终必须达到具体类型。 这些宏(或等价物)很少被定义(根据我的经验),你必须在某个时候处理实现类型......

如果不使用泛型(在C中是新的)并且没有C ++重载,在将值传递给其他函数时会遇到麻烦。 你调用一个int的函数,然后库或平台发生了变化,susecond的基础类型为long,你就引入了一个安静的截断错误!始终启用所有警告!

您的IDE可能会让您将鼠标悬停在您需要的边界上查找基础类型。但是在可能的情况下,只需将类型声明为susecond并让编译器担心它。

在这种情况下完成它的原因是因为(我猜)在16位平台上int可能不会达到高达999,999(微秒......)的值,这需要{{1}但是在long可能是32-bt的32位平台上,这很好。

16位?你确定爷爷?该库并不是新的,可以移植到嵌入式系统,其中16位是一个非常合理的事情。