我正在编写一个字节码解释器,可以使用计算goto或正常的switch
进行主指令分发循环。关键部分包含在一对宏中,可以定义为使用计算goto或不使用。
我希望根据编译器是否支持计算goto来决定默认使用哪种模式。有人知道如何确定吗?据我所知,它们适用于GCC和Clang,但我不想只是硬编码几个随机的编译器名称。
我正在编写一个字节码解释器,可以使用计算goto或正常的switch
进行主指令分发循环。关键部分包含在一对宏中,可以定义为使用计算goto或不使用。
我希望根据编译器是否支持计算goto来决定默认使用哪种模式。有人知道如何确定吗?据我所知,它们适用于GCC和Clang,但我不想只是硬编码几个随机的编译器名称。
如果您正在使用像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)])
HAVE_COMPUTED_GOTOS
。