【问题标题】:What's a good way to check availability of __restrict keyword?检查 __restrict 关键字可用性的好方法是什么?
【发布时间】:2011-05-10 08:51:49
【问题描述】:

我正在寻找一组 #ifdef 来检查 GCC 和 Visual Studio 的 __restrict 关键字的可用性。我假设它需要检查编译器版本,但我不知道它是针对哪个版本引入的。谁能帮帮我?

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

【问题讨论】:

  • 我认为 __restrict 是 C++ 标准认可的关键字。
  • 没关系 - 我需要它也适用于 C 和旧编译器版本 (Visual Studio 98)
  • Visual Studio 98 是什么意思?我不知道存在这样的版本。在 VS.NET (Visual Studio 2002) 之前,只有 Visual Studio 6,而且它的 C++ 编译器漏洞百出,因此没有必要支持它,因为这基本上排除了现代 C++ 的使用。
  • @iammilind:你错了。下划线给出了它。
  • @Tomalak,是什么意思?在 C99 中有一个名为 restrict 的关键字,并且还为 C++ 引入了 __restrict。对不对?

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


【解决方案1】:

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

对于视觉工作室,我的想法为零.. :(

【讨论】:

  • 这个。测试功能,而不是版本。
  • 但它如何转化为微软世界?
【解决方案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;
}

当然,#errors 应该在工作版本中被删除

【讨论】:

  • 我们的商店不使用 C99 - 只有 C89,现在我计划添加限制关键字作为可选的编译器扩展。
【解决方案3】:

我是如何解决的:

#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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 它不适用于例如Visual Studio 98,我也需要能够使用它进行构建。
    • 好的,我不确定 C99 之前的任何事情。正如我在上面的链接中提到的,__restrict 在 C99 之后可用。
    猜你喜欢
    • 2015-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多