如何判断是否支持计算的gotos?

时间:2013-12-14 18:53:31

标签: c compiler-construction interpreter

我正在编写一个字节码解释器,可以使用计算的gotos或普通的switch作为主指令调度循环。关键位包含在几个宏中,可以定义为使用或不使用计算得到的。

我想根据编译器是否支持计算的gotos来决定默认使用哪种模式。有谁知道如何确定?据我所知,他们在GCC和Clang上工作,但我不想只是对几个随机编译器名称进行硬编码。

1 个答案:

答案 0 :(得分:4)

如果您使用autoconf之类的工具,以下功能测试对我有用:

AC_MSG_CHECKING([if ${CC-gcc} supports computed gotos])
AC_COMPILE_IFELSE(
  [AC_LANG_PROGRAM(
    [],
    [[
      void *my_label_ptr = &&my_label; /* GCC syntax */
      goto *my_label_ptr;
      return 1;
      my_label:
      return 0;
    ]])],
  [AC_MSG_RESULT(yes)
   AC_DEFINE(HAVE_COMPUTED_GOTOS, 1,
     [Define to 1 if the compiler supports computed gotos])],
  [AC_MSG_RESULT(no)])

如果编译器支持GCC语法,它将定义宏HAVE_COMPUTED_GOTOS