我正在查看一组#ifdef
来检查GCC和Visual Studio的__restrict
关键字的可用性。我假设它需要检查编译器版本,但我不知道它引入了哪个版本。任何可以帮助我的人?
更新:编译为C89时必须(并且只需要)工作!所以我不能依赖__STDC_VERSION__
表示C99或C99支持。
答案 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
。