使用省略号转换指针到函数

Casting pointer-to-function with ellipsis

本文关键字:函数 指针 转换 省略号      更新时间:2023-10-16

考虑以下程序:

#include <iostream>
typedef void (*fptr)(...);
void foo(fptr func) {
    (*func)(12);
}
void bar(int x) {
    std::cout << "bar : " << x << std::endl;
}
int main() {
    foo(fptr(bar));
}

这编译,运行和打印bar : 12上至少一个编译器:)我发现这在一些遗留代码我应该维护,我想知道这是安全的/定义?

bar与类型fptr不匹配,因此使其工作的唯一方法是使用不安全的强制转换。我想这取决于省略号-魔术如何在内部工作,所以它以某种方式定义吗?

代码正在做的是未定义行为。如果它的作用只是偶然的,那就不能保证它一定会起作用。对于强制转换的函数指针,唯一安全的做法是将其强制转换回原来的类型。