【发布时间】:2011-05-25 18:23:47
【问题描述】:
CLOCKS_PER_SEC 通常表示为什么数据类型? long unsigned int? clock_t?它是否因实施而异?
我问是因为我在返回值中使用了CLOCKS_PER_SEC,并且我想确保我使用最合适的类型。
【问题讨论】:
CLOCKS_PER_SEC 通常表示为什么数据类型? long unsigned int? clock_t?它是否因实施而异?
我问是因为我在返回值中使用了CLOCKS_PER_SEC,并且我想确保我使用最合适的类型。
【问题讨论】:
C 标准所承诺的只是CLOCKS_PER_SEC 是一个类型为clock_t 的常量表达式,它必须是算术类型(可以是整数或浮点类型)。
(C99 7.23 日期和时间<time.h>)
我认为clock_t 通常是long,但我不会赌我是对的。
我通常信任的 Harbison & Steele(第 3 版)建议将 clock_t 转换为 double 以便在您的程序中使用,这样您的代码就可以工作,而不管实际的 clock_t 类型如何(18.1 CLOCK、CLOCK_T、CLOCKS_PER_SEC、TIMES) :
clock函数的作用如下 用于为 ANSI C 程序计时:#include <time.h> clock_t start, finish, duration; start = clock(); process(); finish = clock(); printf("process() took %f seconds to execute\n", ((double) (finish - start)) / CLOCKS_PER_SEC );注意演员如何输入
double允许clock_t和CLOCKS_PER_SEC是浮点数或 积分。
您可以考虑这是否适合您的目的。
【讨论】:
CLOCKS_PER_SEC 成为 constant 表达式。 C99 将其称为“clock_t 类型的表达式”,似乎故意省略了“常量”一词。问题出现在不同的上下文中:CLOCKS_PER_SEC 是否应该在#if 下可用。该标准要求可在#if 下使用符合整数常量表达式的类对象宏。但 AFAIK CLOCKS_PER_SEC 不符合条件,一般情况下不能在 #if 下使用。
clock_t 的常量表达式”。我的 C11 副本省略了“常量”一词。无论它是否恒定,它仍然不能在预处理器表达式中便携使用(正如您在相关问题的答案中所述),因为它不一定是整数类型。
CLOCKS_PER_SEC 是一个宏,通常扩展为文字。
glibc manual 说:
在 GNU 系统中,clock_t 是 相当于 long int 和 CLOCKS_PER_SEC 是一个整数值。 但在其他系统中,clock_t 和 宏 CLOCKS_PER_SEC 的类型 可以是整数或 浮点类型。铸件 处理器时间值加倍,如 上面的例子,确保 算术等运算 打印工作正常并且 始终如一 底层表示是。
【讨论】:
CLOCK_PER_SEC 实际上由 POSIX 指定为 time.h 标头的一部分。
这表示它是sys/types.h 所描述的clock_t。
反过来说:
time_t 和clock_t 应为整数或 实浮点类型。
因此,您可以在可移植代码中假设它是某种整数或浮点类型。如果您只需要声明一个变量来存储值,请将其声明为“clock_t”。
【讨论】: