2016-09-06 4 views
0

В <time.h> в моей установке CYGWIN clock_gettime() определяется под чеком #if defined(_POSIX_TIMERS). Теперь _POSIX_TIMERS определяется в моем <sys/features.h> файле только в условиях -Как включить объявление clock_gettime() в <time.h> в CYGWIN при компиляции для -std = c90?

  1. Если __rtems__ определена, или
  2. Если соблюдено следующее условие -
    #if !defined(__STRICT_ANSI__) || defined(__cplusplus) || __STDC_VERSION__ >= 199901L

Очевидно условие 2 может не выполняться в моем случае.

Есть (хорошо), как я могу установить __rtems__ или любой другой способ, которым я могу убедиться, что _POSIX_TIMERS включена в моем случае (т.е. -std = C90 -pedantic)?

+1

Есть ли конкретная причина, по которой вы используете древний стандарт C90 вместо C99 или C11? Новые стандарты будут выполнять второе условие через '__STDC_VERSION__'. – sendaran

+0

Чтобы увеличить переносимость. –

+1

Если у вас нет определенной унаследованной платформы, для которой требуется C90, я бы сказал, что не использовать C99 является контрпродуктивным с точки зрения переносимости. C99 является значительно улучшенным стандартом по сравнению с C90 и имеет некоторые простые, но важные функции, которые улучшают переносимость, например фиксированные ширины целочисленных типов, которые очень полезны для всех, кто имеет дело с протоколами связи или встроенными системами. Ясно, что Cygwin хочет, чтобы вы использовали C99, поэтому работа вокруг него, скорее всего, вас укусит. '__ANYTHING__' зарезервирован для реализации C, подталкивая эти подходы к территории UB. – sendaran

ответ

-1

Вам необходимо удалить декларацию C90, как определено clock_gettime after.

Все остальное будет трюком, склонным к сбою.

+0

Это все еще может вас укусить. Никогда не возиться с системными заголовками! OP должен использовать стандарт C, если это невозможно, C99. – Olaf

+0

@Olaf Я имел в виду вызов gcc. Не предлагать касаться системных файлов заголовков – matzeri

+0

Неясно, что вы имеете в виду. 1) Заголовки не должны включать определения (за исключением 'inline') 2) Любая модификация требует изменения заголовка. 3) изменение стандартных макросов (которые являются '# define'd, а не объявлены) строго запрещено стандартом. – Olaf