好吧,这是一个愚蠢的问题,因为我已经在C编码了一段时间,但我从来没有真正弄明白。
C库喜欢实现自己的模糊数据类型,这些类型通常似乎是对现有类型的重新实现(提示此问题的库是http://man7.org/linux/man-pages/man2/gettimeofday.2.html)。
我的问题是:你究竟应该弄清楚这些一次性数据类型究竟是什么?它们似乎永远不会在手册页中的任何地方定义,因此很少深入挖掘头文件的源代码我不知所措。例如,从上面提到的手册页中,什么是“suseconds_t”,以及在一般情况下,我将如何弄清楚具体内容是什么?
答案 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位是一个非常合理的事情。