1
int _cdecl    f (int x) { return 0; }
int _stdcall  f (int y) { return 0; }

名称修改后将是:

_f
_f@4

哪个不冲突,这在 c 中是否允许,如果不允许,为什么?

4

2 回答 2

4

关键字_cdecland_stdcall不是 C 语言的一部分。这些是 Microsoft 扩展,之前有类似的 Borland 扩展。

在标准 C 语言中,您不能声明调用约定。显然,声明的每个函数都等同于 MS 编译器所指的“ _cdecl”约定。

当您调用它们时,可以使用内联汇编来区分这两个函数。因为您使用的是特定于平台的 C 供应商扩展,所以您可能会考虑使用内联汇编。

于 2011-05-12T16:46:03.570 回答
1

首先,那不是弄脏,那是装饰。重载是 C++ 编译器会发生的事情,因为 C++ 最初旨在支持使用 C 样式链接工具进行重载。

至于你的问题,你不能有两个同名的函数。为了应用该规则,使用未修饰的名称。

为什么会这样?我想这是因为装饰和调用约定不是 C 标准的一部分,并且特定于每个编译器。我很确定支持多种调用约定的 C 编译器只是在 C 发明之后的几年才出现。

于 2011-05-12T16:43:28.467 回答