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

mun*_*ent 4 c compiler-construction interpreter

我正在编写一个字节码解释器,它可以使用计算的 goto 或switch主指令调度循环的正常值。关键位包含在几个宏中,这些宏可以定义为使用或不使用计算的 goto。

我想根据编译器是否支持计算 goto 来决定默认使用哪种模式。有谁知道如何确定?据我所知,它们适用于 GCC 和 Clang,但我不想只硬编码几个随机编译器名称。

Som*_*ude 5

如果您使用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)])
Run Code Online (Sandbox Code Playgroud)

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