我正在编写一个字节码解释器,可以使用计算的gotos或普通的switch
作为主指令调度循环。关键位包含在几个宏中,可以定义为使用或不使用计算得到的。
我想根据编译器是否支持计算的gotos来决定默认使用哪种模式。有谁知道如何确定?据我所知,他们在GCC和Clang上工作,但我不想只是对几个随机编译器名称进行硬编码。
答案 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
。