【问题标题】:Type of CLOCKS_PER_SECCLOCKS_PER_SEC 的类型
【发布时间】:2011-05-25 18:23:47
【问题描述】:

CLOCKS_PER_SEC 通常表示为什么数据类型? long unsigned int? clock_t?它是否因实施而异?

我问是因为我在返回值中使用了CLOCKS_PER_SEC,并且我想确保我使用最合适的类型。

【问题讨论】:

    标签: c++ time types


    【解决方案1】:

    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_tCLOCKS_PER_SEC 是浮点数或 积分。

    您可以考虑这是否适合您的目的。

    【讨论】:

    • 现在我注意到这与 Tomalak 在他的回答 (stackoverflow.com/questions/6129029/type-of-clocks-per-sec/…) 中提到的 glibc 手册中的建议相同
    • C99 不相关。本题是关于C++的,两者没有关系。
    • 我看不出在 C 标准中哪里需要 CLOCKS_PER_SEC 成为 constant 表达式。 C99 将其称为“clock_t 类型的表达式”,似乎故意省略了“常量”一词。问题出现在不同的上下文中:CLOCKS_PER_SEC 是否应该在#if 下可用。该标准要求可在#if 下使用符合整数常量表达式的类对象宏。但 AFAIK CLOCKS_PER_SEC 不符合条件,一般情况下不能在 #if 下使用。
    • 我的 C99 副本(我想这是我在回答时的来源)说“扩展为类型为 clock_t 的常量表达式”。我的 C11 副本省略了“常量”一词。无论它是否恒定,它仍然不能在预处理器表达式中便携使用(正如您在相关问题的答案中所述),因为它不一定是整数类型。
    • @Michael Burr:是的,原来的 C99 说“恒定”。在 C99 TC2 中,这个词已经消失了。
    【解决方案2】:

    CLOCKS_PER_SEC 是一个宏,通常扩展为文字。

    glibc manual 说:

    在 GNU 系统中,clock_t 是 相当于 long int 和 CLOCKS_PER_SEC 是一个整数值。 但在其他系统中,clock_t 和 宏 CLOCKS_PER_SEC 的类型 可以是整数或 浮点类型。铸件 处理器时间值加倍,如 上面的例子,确保 算术等运算 打印工作正常并且 始终如一 底层表示是。

    【讨论】:

      【解决方案3】:

      CLOCK_PER_SEC 实际上由 POSIX 指定为 time.h 标头的一部分。

      这表示它是sys/types.h 所描述的clock_t。

      反过来说:

      time_t 和clock_t 应为整数或 实浮点类型。

      因此,您可以在可移植代码中假设它是某种整数或浮点类型。如果您只需要声明一个变量来存储值,请将其声明为“clock_t”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多