GCC с -std = c99 жалуется на то, что не знает struct timespec

Когда я пытаюсь скомпилировать это на Linux сgcc -std=c99компилятор жалуется на незнаниеstruct timespec, Однако, если я скомпилирую это без-std=c99 все отлично работает

#include <time.h>

int main(void)
{
  struct timespec asdf;
  return 0;
}

Почему это так и есть ли способ заставить его работать с-std=c99?

Ответы на вопрос(2)

Я бы порекомендовал компилировать с-std=gnu99.

Чтобы уточнить это. По умолчанию gcc компилируется с -std = gnu89. Вот результаты для следующего исходного кода.

#include <time.h>

int main() {
    struct timespec asdf;
    return 0;
}
[1:25pm][[email protected] /tmp] gcc -std=gnu89 foo.c
[1:26pm][[email protected] /tmp] gcc -std=gnu99 foo.c

[1:25pm][[email protected] /tmp] gcc -std=c89 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known

[1:26pm][[email protected] /tmp] gcc -std=c99 foo.c
foo.c: In function ‘main’:
foo.c:4: error: storage size of ‘asdf’ isn’t known
 Bill Lynch06 окт. 2010 г., 19:27
Он сравнивает -std = gnu89 с -std = c99. Более правильное сравнение будет от -std = gnu89 до -std = gnu99. Хотя я согласен, что ответ Джонатана намного лучше объясняет, что здесь происходит.
 Karel Petranek06 окт. 2010 г., 19:23
Не совсем ответ на вопрос
 caf06 окт. 2010 г., 23:50
Недостатки этого ответа совершенно необоснованны. Это дает понять, что ОП сравниваетgnu89 сc99Вот почему возникает ошибка, и показывает, что такая же ошибка возникает сc89, Это полезная дополнительная информация.

Временная спецификация происходит из POSIX, поэтому вы должны «включить» определения POSIX:

#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */

#include <time.h>

void blah(struct timespec asdf)
{
}

int main()
{
    struct timespec asdf;
    return 0;
}

Раздел в верхней части - это то, чем я сейчас пользуюсь - он запускает определения из Single UNIX Specification (SUS), основанные на том, используете ли вы компилятор C99 или C89.

Если вы хотитеPOSIX 2008 (SUS v4) материал, используйте _XOPEN_SOURCE 700Если вы хотитеPOSIX 2004 (SUS v3) материал, используйте _XOPEN_SOURCE 600Если вы хотитеPOSIX 1995 (SUS v2, 1997) материал, используйте _XOPEN_SOURCE 500

Для моих систем POSIX 2008 не так широко доступен, как 2004, так что это то, что я использую - но YMMV. Обратите внимание, что для SUS v3 и v4 требуется компиляция C99. На Solaris, по крайней мере, использование C89 не удастся.

 R..06 окт. 2010 г., 23:49
В последней версии SUS практически все функциональные возможности были перенесены в базу, а XSI - это, в основном, устаревший интерфейс. Конечно, я прикрываю спину, говоря «в основном». ;-)
 Mikel20 апр. 2011 г., 02:22
_XOPEN_SOURCE действительно приносит некоторые полезные вещи по сравнению с_POSIX_C_SOURCEНапример, strdup (), strptime (), srandom (), realpath (), lockf () и некоторые большие файлы поддержки файлов.
 Jonathan Leffler06 окт. 2010 г., 22:05
@R ..: Да, ты педантично прав. Однако на практике вы действительно хотите только POSIX, а не XSI? Если это так, вы можете прочитать и установить только POSIX. Для большинства людей данное решение разумно.
 R..06 окт. 2010 г., 20:42
Вы должны определить_POSIX_C_SOURCE на правильные значения, если вы просто хотите POSIX._XOPEN_SOURCE для расширений XSI.

Ваш ответ на вопрос