c如何使用函数名来评估函数指针

时间:2016-09-11 13:13:01

标签: c pointers

这是我的代码:

typedef void (*FUNCPT)(void);

void func1();

int main(){
    FUNCPT fpt1;
    char *s = "func1";

    return 0;
}

我可以像这样评估fpt1:

fpt1 = func1;

但是有一些原因我必须使用函数名来评估函数指针,我期望通过这样的东西得到相同的值:

fpt1 = (FUNCPT)s;

我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

评估函数名称到函数指针的唯一方法是(不使用固定的符号表与自己代码中的名称),使用共享库和dlopen()dlsym()和喜欢Linux / Unix世界以及Windows世界中相应的等价物。

  1. 将您要解析的功能放入共享库
  2. 使用dlopen
  3. 从您的程序中打开该共享库
  4. 使用dlsym
  5. 按名称查找符号
  6. 将返回的地址转换为正确的函数指针并调用它
  7. 然而,这是一个操作系统,而不是一个C问题。如果没有说明您的平台,则无法提供进一步的帮助。

答案 1 :(得分:1)

我认为没有任何可移植的方法可以做到这一点。我认为你需要为此编写自己的代码。例如,一个查找表,如:

library(shiny)

ui <- fluidPage( 
  shiny::numericInput(inputId = 'n',label = 'n',value = 2),
  shiny::textOutput('nthValue'),
  shiny::textOutput('nthValueInv')  
)

fib <- function(n) ifelse(n<3, 1, fib(n-1)+fib(n-2))

server<-shinyServer(function(input, output, session) { 
  myReactives <- reactiveValues()  
  observe(  myReactives$currentFib <-  fib(as.numeric(input$n))  ) 
  output$nthValue    <- renderText({ myReactives$currentFib  })
  output$nthValueInv <- renderText({ 1 / myReactives$currentFib  }) 
})

shinyApp(ui = ui, server = server)