我正在尝试用 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/