Timespec не найден во времени .h

Мне нужно переписать приложение с С++ на C. Я использую gcc и Eclipse на Ubuntu 12.04. При этом я столкнулся с этой ошибкой

    ../src/TTNoddy.c: In function ‘main’:
    ../src/TTNoddy.c:16:2: error: unknown type name ‘timespec’

Вот мой фрагмент кода, который воспроизводит проблему

    #include <time.h>

    int main(void) {

        timespec TS;
        TS.tv_nsec = 1;

        return 0;
    }

Я запутался здесь. Я - кодер С++ и никогда не писал чистого приложения C в своей жизни, но справочная страница для clock_gettime четко указывает, что timespec найден в файле заголовка time.h, который я включая сюда. Что я пропустил?

Ответы

Ответ 1

timespec - это struct, вам нужно явно указать компилятору это. Если вы внимательно прочитаете страницу руководства, вы увидите, что это указано.

Это должно работать:

#include <time.h>

int main(void) {
    struct timespec TS;
    TS.tv_nsec = 1;

    return 0;
}

Дополнительная заметка. Если она была определена как typedef struct, вам не нужно было бы добавлять часть struct вручную. Но вы должны предположить, что большинство/все чистые C-структуры не определены как typedef

Ответ 2

Это не должно быть просто timepec, поскольку timespec - это структура. Это должно быть struct timespec. Пожалуйста, внесите изменения в свой код.

Ответ 3

Я получил эту ошибку при попытке скомпилировать рабочий проект под Visual Studio 2015.

Решение заключалось в том, чтобы добавить HAVE_STRUCT_TIMESPEC в определения препроцессора.

Через GUI: Свойства проекта (панорамирование) > Страницы свойств (значок) > Свойства конфигурации > C/С++ > Препроцессоp > Определения препроцессорa > Изменить > Добавить HAVE_STRUCT_TIMESPEC

Или вручную: отредактируйте каждый файл проекта и замените каждый экземпляр <PreprocessorDefinitions> (может быть несколько на каждый файл) с чем-то вроде:

<PreprocessorDefinitions>HAVE_STRUCT_TIMESPEC;WIN32;__GNU_LIBRARY__;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

NB: я нашел этот ответ где-то в проблеме Github, поэтому я размещаю его здесь.

Ответ 4

Эта проблема на некоторое время доставляла мне проблемы, и в конечном итоге я определил в своем коде struct timepec. (просто скопировал его, прямо из человека nanosleep)

#include <time.h>

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

int main(void) {
    struct timespec TS;
    TS.tv_nsec = 1;

    return 0;
}

Ответ 5

Я знаю, что это старый вопрос, но у меня возникла та же проблема после обновления с gcc 6.3 до 7.1. После просмотра изменений вы должны определить _GNU_SOURCE, чтобы включить struct_timespec.h.