Какой хороший способ проверить доступность ключевого слова __restrict?

#c #visual-studio #gcc #c89 #restrict-qualifier

#c #visual-studio #gcc #c89 #restrict-квалификатор

Вопрос:

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

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

Комментарии:

1. Я думал, __restrict это ключевое слово, одобренное стандартом C .

2. Это не имеет значения — мне нужно, чтобы это работало также для C и старых версий компилятора (Visual Studio 98)

3. Что вы подразумеваете под Visual Studio 98? Я не в курсе, что такая версия существует. До VS.NET (Visual Studio 2002) существовала только Visual Studio 6, и ее компилятор C настолько глючный, что в его поддержке не должно быть необходимости, поскольку это по существу исключает использование современного C .

4. @iammilind: Ты ошибаешься. Подчеркивания выдают его.

5. @Tomalak, значит? В C99 есть ключевое слово, вызываемое restrict amp; __restrict также введено для C . Разве это не правильно?

Ответ №1:

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

Что касается visual studio, у меня нет ни малейшего представления .. 🙁

Комментарии:

1. Это. Проверяйте функции, а не версии.

2. Но как это переводится в Microsoft world?

Ответ №2:

Просто используйте стандартное ключевое слово 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. В нашем магазине мы не используем C99 — только C89, теперь я планирую добавить ключевое слово restrict в качестве дополнительного расширения компилятора.

Ответ №3:

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

 #if defined(__GNUC__) amp;amp; ((__GNUC__ > 3) || (__GNUC__ == 3 amp;amp; __GNUC_MINOR__ >= 1))
#   define SKP_restrict __restrict
#elif defined(_MSC_VER) amp;amp; _MSC_VER >= 1400
#   define SKP_restrict __restrict
#else
#   define SKP_restrict
#endif
  

Ответ №4:

ИМХО, __restrict должно быть доступно во всех стандартных компиляторах для обеих программ на C / C . В C99 restrict определенном смысле это похоже на.

Комментарии:

1. Оно недоступно, например, для Visual Studio 98, мне также нужно иметь возможность выполнять сборку с его помощью.

2. Хорошо, я ни в чем не уверен до C99. Как я упоминал по ссылке выше, __restrict доступно после C99.