外部"C"功能是一个单独的类型吗?

rod*_*igo 17 c++ overloading function-pointers extern-c

从C++ 11草案,7.5(第1段):

具有不同语言链接的两种函数类型是不同的类型,即使它们在其他方面是相同的.

所以我可以根据语言链接做过载:

extern "C" typedef void (*c_function)();
typedef void (*cpp_function)();

void call_fun(c_function f)
{
}
void call_fun(cpp_function f)
{
}

extern "C" void my_c()
{
}
void my_cpp()
{
}
int main()
{
    call_fun(my_c);
    call_fun(my_cpp);
}
Run Code Online (Sandbox Code Playgroud)

但是,使用GCC 4.7.1,此示例代码提供了错误消息:

test.cpp: In function 'void call_fun(cpp_function)':
test.cpp:7:6: error: redefinition of 'void call_fun(cpp_function)'
test.cpp:4:6: error: 'void call_fun(c_function)' previously defined here
Run Code Online (Sandbox Code Playgroud)

使用CLang ++:

test.cpp:7:6: error: redefinition of 'call_fun'
void call_fun(cpp_function f)
     ^
test.cpp:4:6: note: previous definition is here
void call_fun(c_function f)
     ^
Run Code Online (Sandbox Code Playgroud)

现在的问题是:

  • 我对标准的理解是否正确?这段代码有效吗?

  • 有没有人知道这些是编译器中的错误还是为了兼容性目的而故意这样做?

Jam*_*nze 10

代码显然是有效的.关于将链接集成到类型中,G ++(以及许多其他编译器)有点松懈(温和地说).


Ste*_*sop 8

这是gcc中的一个已知错误,它们记录了它不符合,因为这个bug阻止了超级错误,"C++ 98一致性问题".

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316

检查创建日期.

关于引入修复的实用性,最后会有一些讨论.所以你最后一个问题的答案是"两个":这是一个错误,故意留下了bug以保持兼容性.

具有相同问题的其他编译器可能独立地产生了错误,但我认为他们更可能知道这是错误的但是想要与gcc进行错误兼容.