#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.