Я хотел бы передать макрос clockid_t в качестве аргумента времени компиляции (gcc -D CLOCK=CLOCK_REALTIME file.c), чтобы определить макрос CLOCK в моем коде. Как мне узнать их соответствующие целочисленные значения, чтобы я мог это сделать?

Мне нужны 4 clockid_t, перечисленные на странице руководства: https: //linux.die. net / man / 3 / clock_gettime

Система - Linux.

-1
Cheetaiean 15 Окт 2021 в 01:33

2 ответа

Лучший ответ

Посмотрите в <time.h>, чтобы получить фактические значения.

Однако обратите внимание, что определенные системой идентификаторы часов могут отличаться по значению от платформы к платформе. Например, CLOCK_MONOTONIC - это 1 в Linux, но это 4 во FreeBSD.

Итак, вам лучше определить свои собственные значения макросов, а затем сопоставить их с соответствующими идентификаторами часов в вашем коде, используя константы в <time.h>, которые зависят от того, для какой платформы (платформ) вы компилируете.

#include <time.h>

clockid_t GetDefinedClock()
{
    #if CLOCK == 1
    return CLOCK_REALTIME;
    #elif CLOCK == 2
    return CLOCK_MONOTONIC;
    #elif CLOCK == 3
    return CLOCK_PROCESS_CPUTIME_ID;
    #elif CLOCK == 4
    return CLOCK_THREAD_CPUTIME_ID;
    #else
    #error "NO CLOCK DEFINED!"
    return 0;
    #endif
}

clockid_t clock = GetDefinedClock();
// use clock as needed...
2
Remy Lebeau 14 Окт 2021 в 22:51

Вам не нужно ничего делать! -DCLOCK=CLOCK_REALTIME или что-то еще в командной строке будет Just Work.

Это связано с тем, что тело макроса раскрывается после раскрытия макроса , а не после определения макроса. Итак, пока time.h был включен до того, как CLOCK использован , CLOCK будет расширен, а затем CLOCK_REALTIME также будет расширен.

3
zwol 14 Окт 2021 в 23:13