C++中“C”风格代码的链接 我试图在C++中运行C风格的代码,而我的编译器给出以下错误:
第5行:错误:字符串常量前应为非限定id 第二:我的目标是理解d行的错误C++中“C”风格代码的链接 我试图在C++中运行C风格的代码,而我的编译器给出以下错误:,c++,extern,C++,Extern,第5行:错误:字符串常量前应为非限定id 第二:我的目标是理解d行的错误 using namespace std; typedef int (*pfun)(int); // line a int main() { extern "C" void foo(pfun); // line b extern "C" int g(int); // line c foo( g ); // line d, Error
using namespace std;
typedef int (*pfun)(int); // line a
int main()
{
extern "C" void foo(pfun); // line b
extern "C" int g(int); // line c
foo( g ); // line d, Error
return 0;
}
您需要将外部C行移动到全局范围
#include <cstdlib>
using namespace std;
typedef int (*pfun)(int); // line a
extern "C" void foo(pfun); // line b
extern "C" int g(int); // line c
int main(void)
{
foo( g ); // line d, Error
return 0;
}
错误不在d行,而是在使用链接规范extern C时发生的 根据第7.5.4节: 链接规范只能出现在名称空间范围内 这意味着您可以将函数移出全局命名空间,这对于C函数来说非常常见:
typedef int (*pfun)(int); // line a
extern "C" void foo(pfun); // line b
extern "C" int g(int); // line c
int main()
{
foo(g); // line d
return 0;
}
或在命名命名空间内:
namespace c_funcs
{
typedef int (*pfun)(int); // line a
extern "C" void foo(pfun); // line b
extern "C" int g(int); // line c
}
int main()
{
c_funcs::foo(c_funcs::g); // line d
return 0;
}
。。。但不在函数范围内,就像您的代码所做的那样
链接规范嵌套,所以您甚至可以做一些奇怪的事情来提供foo和gc链接:
typedef int (*pfun)(int); // line a
extern "C" int main()
{
void foo(pfun); // line b
int g(int); // line c
foo(g); // line d
return 0;
}
如果您解释这里应用的名称空间以及作用域,那就更好了。谢谢这里的名称空间是为每个翻译单元创建的默认名称空间,它位于文件范围内,我猜extern C int xint和int xint不是相同的类型。C++11,7.5/1