【发布时间】:2018-04-06 08:49:27
【问题描述】:
编译器如何知道函数指针指向的函数的ABI?
在计算机软件中,应用程序二进制接口 (ABI) 是 两个程序模块之间的接口。
由于在 C/C++ 中,函数指针仅指定 API,因此不知道它实际使用的是哪种 ABI,这对编译器来说不会是个问题,尤其是当他们无法静态计算出来的时候?
这是否意味着使用这种指针的程序员需要手动指定调用约定?
如果是这样,该怎么做?谁能给我一些关于这个编译器文档的链接?
【问题讨论】:
-
这就是为什么编译器在同一系统上一起工作时尝试使用相同的 ABI。对于同一种语言,某些编译器在它们之间不兼容。
-
“这是否意味着使用这种指针的程序员需要手动指定调用约定”:是(通常在包含文件中)
-
您还可以在函数指针上指定调用约定。例如,MSDN 列出了以下示例:
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);(请参阅msdn.microsoft.com/en-us/library/zxk0tw93%28v=VS.100%29.aspx)。 -
@pschill:这种做法不是 MSVC 特有的吗?
-
@einpoklum 是的。其他编译器可能使用不同的语法。
标签: c++ c function function-pointers