什么';What’检查uu restrict关键字可用性的好方法是什么?

什么';What’检查uu restrict关键字可用性的好方法是什么?,c,visual-studio,gcc,c89,restrict-qualifier,C,Visual Studio,Gcc,C89,Restrict Qualifier,我正在寻找一组#ifdef,以检查GCC和visualstudio的u restrict关键字的可用性。我假设它需要检查编译器版本,但我不知道它是为哪个版本引入的。有人能帮我吗 更新:当编译为C89时,这必须(并且只需要)起作用!因此,我不能依赖于表示C99或C99支持的\uu STDC\u VERSION.。IMHO应在所有标准编译器中为两个C/C++程序提供。它在某种程度上类似于C99限制 只需使用C99标准关键字限制,并可能将其定义为其他内容 您可以测试C99是否符合要求,例如: #if

我正在寻找一组
#ifdef
,以检查GCC和visualstudio的
u restrict
关键字的可用性。我假设它需要检查编译器版本,但我不知道它是为哪个版本引入的。有人能帮我吗


更新:当编译为C89时,这必须(并且只需要)起作用!因此,我不能依赖于表示C99或C99支持的
\uu STDC\u VERSION.

IMHO应在所有标准编译器中为两个C/C++程序提供。它在某种程度上类似于C99限制

只需使用C99标准关键字
限制
,并可能将其定义为其他内容

您可以测试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;
}
#如果1.
#错误不符合
#定义限制\uuuu限制/*使用实现\uuuuuu格式*/
#否则
#ifndef\uU STDC\u版本__
#错误不符合
#定义限制\uuuu限制/*使用实现\uuuuuu格式*/
#否则
#如果STDC版本小于199901L
#C99之前的C编译器错误
#定义限制\uuuu限制/*使用实现\uuuuuu格式*/
#否则
#/*一切正常*/
#恩迪夫
#恩迪夫
#恩迪夫
int-fx(int*restrict a,char*restrict b){
*b=*a;
返回0;
}
内部主(空){
int a[1];
charb[1];
外汇(a、b);
返回0;
}

当然,
#错误应该在工作版本中编辑掉

在“配置、制作、制作安装”场景中,这应该在“配置”中进行检查configure“应该在config.h中定义一个”HAS_RESTRICT“。这应该依次在标题中检查,以定义合适的宏

对于visual studio,我没有任何想法..:(

我是如何修复的:

#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

我认为<代码>限制VS.NET >是一个C++标准认可的关键字。没关系。我需要这个也适用于C和旧的编译器版本(Visual Studio 98)。Visual Studio 98是什么意思?我不知道这样的版本存在。在Visual Studio 2002之前只有Visual Studio 6和它的C++编译器是如此的不安全,支持它不应该是必要的,因为它基本上排除了使用现代C++。@ IAMMLIN:你错了。下划线把它给了。@ Tomalak,意思是C99中有一个关键字叫做“代码>限制<代码> > C++?“对吗?它不适用于例如Visual Studio 98,我也需要能够使用它进行构建。好的,我不确定C99之前的任何内容。正如我在上面的链接中所提到的,
\u restrict
在C99之后可用。我们在我们的商店中不使用C99-只使用C89,现在我计划添加restrict关键字作为可选的编译器扩展。这个。测试。”用于功能,而不是版本。但它如何转化为Microsoft world?