检查__restrict关键字的可用性有什么好方法?

时间:2011-05-10 08:51:49

标签: c visual-studio gcc c89 restrict-qualifier

我正在查看一组#ifdef来检查GCC和Visual Studio的__restrict关键字的可用性。我假设它需要检查编译器版本,但我不知道它引入了哪个版本。任何可以帮助我的人?​​

更新:编译为C89时必须(并且只需要)工作!所以我不能依赖__STDC_VERSION__表示C99或C99支持。

4 个答案:

答案 0 :(得分:1)

只需使用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应该在工作版本中修改

答案 1 :(得分:1)

在'configure,make,make install'场景中,应该在'configure'中进行检查。 'configure'应该在config.h中定义'HAS_RESTRICT'。这应该在标题中检查以定义合适的宏。

对于视觉工作室,我没有想法...... :(

答案 2 :(得分:1)

我如何解决它:

#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

答案 3 :(得分:0)

恕我直言,__restrict应该可用于所有C / C ++程序的标准编译器。它以某种方式类似于C99 restrict