C++中“C”风格代码的链接 我试图在C++中运行C风格的代码,而我的编译器给出以下错误:

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

第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

    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