c++ - 如何在运行时生成函数?

标签 c++ macros operating-system c++14

我正在尝试用 C++ 编写中断服务例程,这里是一些代码片段

void handlerProxy(int intrNo) {}

typedef void(*IntrHandler)();

IntrHandler IDT[256];

我想像这样在运行时或编译时初始化IDT:

for (size_t i = 0; i < 256; ++i) {
    // It doesn't compile
    IDT[i] = std::bind(handlerProxy, i);
    // or
    IDT[i] = [i] () {handlerProxy(i);};
}

问题是

  • 带捕获的 lambda 函数不能转换为函数指针
  • 我的代码将使用 -fno-rtti 进行编译,因此 std::function::target 不可用

我有没有可能做到这一点? 我不想手动编写 IDT[0]= ... IDT[1]=... 或使用其他程序生成它。允许使用宏和内联 asm。 IDT 的类型可以改变,但是 IDT 的元素应该是函数地址,这意味着 jmp IDT[0] 应该是有效的.

最佳答案

你可以像这样使 intrNo 成为模板参数:

template <int intrNo>
void handlerProxy() {}

typedef void(*IntrHandler)();

并使用包扩展初始化数组:

template <typename IS>
struct helper;

template <size_t ... Is>
struct helper<std::index_sequence<Is...>> {
  static constexpr std::array<IntrHandler, sizeof...(Is)> make_handlers() {
    return {{ &handler_proxy<Is> ... }};
  }
};

constexpr std::array<IntrHandler, 256> IntrHandlers = helper<std::make_index_sequence<256>>::make_handlers();

IntrHandler * IDT = IntrHandlers.data();

(买者自负,代码未经测试)

关于c++ - 如何在运行时生成函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799327/

相关文章:

C11 _Generic 用法

macros - Haxe宏将null设置为调用实例?

linux - 为什么现代操作系统需要这么多内存?

c++ - 查找图中的最短路径,有附加限制

c++ - C++中使用数组访问多个不同长度数组的正确方法

c++ - 打印到文件和控制台 C++

programming-languages - 你会在你的操作系统中使用哪种语言?

c++ - 如何在 block 复制期间向量化范围检查?

c++ - 寻找将取代功能的宏

python - 获取 Ubuntu 或 Python 中打开的目录/浏览器的路径或 url?