Какой хороший способ проверить доступность ключевого слова __restrict? - PullRequest
2 голосов
/ 10 мая 2011

Я ищу набор #ifdef для проверки доступности ключевого слова __restrict для GCC и Visual Studio.Я предполагаю, что он должен проверить версию компилятора, но я не знаю, для каких версий он был представлен.Кто-нибудь, кто может мне помочь?

ОБНОВЛЕНИЕ: Это должно (и нужно только) работать при компиляции как C89!Поэтому я не могу полагаться на __STDC_VERSION__, указывающий поддержку C99 или C99.

Ответы [ 4 ]

1 голос
/ 10 мая 2011

Как я это исправил:

#if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
#   define SKP_restrict __restrict
#elif defined(_MSC_VER) && _MSC_VER >= 1400
#   define SKP_restrict __restrict
#else
#   define SKP_restrict
#endif
1 голос
/ 10 мая 2011

Просто используйте стандартное ключевое слово C99 restrict и, возможно, #define, используйте другое слово.

Вы можете проверить соответствие C99, например:

#if __STDC__ != 1
#    error not conforming
#    define restrict __restrict /* use implementation __ format */
#else
#    ifndef __STDC_VERSION__
#        error not conforming
#        define restrict __restrict /* use implementation __ format */
#    else
#        if __STDC_VERSION__ < 199901L
#            error Compiler for C before C99
#            define restrict __restrict /* use implementation __ format */
#        else
#            /* all ok */
#        endif
#    endif
#endif

int fx(int *restrict a, char *restrict b) {
  *b = *a;
  return 0;
}

int main(void) {
  int a[1];
  char b[1];
  fx(a, b);
  return 0;
}

Конечно, #error s должны быть отредактированы в рабочей версии

1 голос
/ 10 мая 2011

В сценарии «настроить, сделать, сделать установку» это должно быть отмечено в «конфигурации». 'configure' должен определить 'HAS_RESTRICT' в config.h. Это, в свою очередь, должно быть проверено в ваших заголовках, чтобы определить подходящий макрос.

Для визуальной студии у меня нулевая идея ..: (

0 голосов
/ 10 мая 2011

IMHO, __restrict должно быть доступно во всех стандартных компиляторах для обеих программ на C / C ++. Это похоже на C99 restrict определенным образом.

...