Макросы, определенные в time.h, не распознаны

Первоначально я хотел привести структурное время к временному.

Сначала это не казалось сложным, так как там предлагается решение: существует ли стандартный способ преобразования struct timeval в struct timepec?

Макрос, TIMEVAL_TO_TIMESPEC должен делать работу.

Как указано в документации ( https://www.daemon-systems.org/man/TIMEVAL_TO_TIMESPEC.3.html), он запрашивает только sys/time.h быть включенным. Но я все еще получаю тот же ответ, когда пытаюсь скомпилировать:`warning: неявное объявление функции 'TIMEVAL_TO_TIMESPEC' [-Wimplicit-function-объявление]

Я даже попытался скомпилировать пример, приведенный в документации:

#include<time.h>
#include <assert.h>
#include<sys/time.h>

static void example(struct timespec *spec, time_t minutes) {
    struct timeval elapsed;

    (void)gettimeofday(&elapsed, NULL);

    _DIAGASSERT(spec != NULL);
    TIMEVAL_TO_TIMESPEC(&elapsed, spec);

    /* Add the offset for timeout in minutes. */
    spec->tv_sec = spec->tv_sec + minutes * 60;
}

int main(){
    return 0;
}

При компиляции я получаю:

test.c: In function ‘example’:
test.c:10:2: warning: implicit declaration of function ‘_DIAGASSERT’ [-Wimplicit-function-declaration]
  _DIAGASSERT(spec != NULL);
  ^
test.c:11:2: warning: implicit declaration of function ‘TIMEVAL_TO_TIMESPEC’ [-Wimplicit-function-declaration]
  TIMEVAL_TO_TIMESPEC(&elapsed, spec);
  ^
/tmp/ccqWnL9I.o: In function `example':
test.c:(.text+0x43): undefined reference to `_DIAGASSERT'
test.c:(.text+0x5b): undefined reference to `TIMEVAL_TO_TIMESPEC'
collect2: error: ld returned 1 exit status

Что я сделал, что не так?

1 ответ

Решение

Вы связались со справочной страницей NetBSD. Нет никаких гарантий, что то, что вы прочитаете, будет иметь какое-либо отношение к Linux или любой другой ОС. На какой ОС вы разрабатываете?

Похоже, что макросы являются стандартными в glibc, который является библиотекой C, которую вы используете практически в любой системе Linux. Однако, если вы осмотрите sys/time.h файл, вы увидите, что макросы стробируются #ifdef:

#ifdef __USE_GNU
/* Macros for converting between `struct timeval' and `struct timespec'.  */
# define TIMEVAL_TO_TIMESPEC(tv, ts) {                                   \
        (ts)->tv_sec = (tv)->tv_sec;                                    \
        (ts)->tv_nsec = (tv)->tv_usec * 1000;                           \
}
# define TIMESPEC_TO_TIMEVAL(tv, ts) {                                   \
        (tv)->tv_sec = (ts)->tv_sec;                                    \
        (tv)->tv_usec = (ts)->tv_nsec / 1000;                           \
}
#endif

Так что вам нужно #define __USE_GNU перед включением sys/time.h чтобы выставить эти макросы. Как указывает @alk в комментариях, вы получаете это и многое другое, определяя _GNU_SOURCE, Вы можете прочитать больше об этом здесь.

Другие вопросы по тегам