随着正常功能,一个可以写
extern "C" int Frotz(int); // in a header
int Frotz(int x) { return x; }
函数指针,不过,这似乎已经编译器之间的不一致实现。
extern "C" int Klutz(int (*)(int), int);
int Klutz(int (*fptr)(int), int x) { return (*fptr)(x); }
在声明中,该说法也extern "C"
。 在定义中,大多数编译器似乎满足这些功能,使Klutz
的extern "C"
的功能。 太阳和Cray编译器,然而,解释这些功能作为不同,产生一个重载int Klutz(int (*fptr)(int), int x)
后来生成链路时间误差。
虽然C ++ 98和第7.5.5 C ++ 11所担保的诠释Frotz
,我不能告诉我们,如果标准不明确是否extern "C"
之前或检查超载后应该发生的匹配。
应该Klutz
以上产生错位(C ++)符号或extern "C"
符号?
编辑1
我可以用一个typedef来澄清对函数指针有C或C ++ ABI,但我感兴趣的(a)是否这里的代码定义Klutz
有C ++联动,(B),其定义为具有C键,或(c )根据标准是模糊的,因此编译器可以自由选择如何解释它。
编辑2
这似乎是一个已知的问题,至少通过搜索bug跟踪这些编译器。 在我的测试中,GCC,铛,英特尔,MSVC,IBM XL,PathScale公司,PGI和Open64都分不清函数类型是除了语言联动,由标准明确要求相同(参见7.5.1节,引接受的答案)。 修复此将打破很多现有的代码,需要一个ABI改变。 我不知道实际使用对C与C ++语言联动不同的调用约定的任何编译器。
GCC错误 :“找到理由,要求从下一个标准删除此功能是怎么样的相关;-)” ......“我们甚至可以在官方WONTFIX决定。”
铛的错误 :“我害怕的实际执行这一规则,因为这样做正确意味着使所述规范类型,它是要打破一吨的代码的语言联动的一部分。”